2013-10-09 76 views
1

我有以下的Spring MVC 3.2.4方法:Spring MVC的重定向与变量

@RequestMapping(value = "/products/{product}", method = RequestMethod.POST) 
public String update(Product product, @Valid @ModelAttribute("productForm") ProductForm productForm, BindingResult bindingResult, Model model) { 
    if (bindingResult.hasErrors()) { 
     return "products/view"; 
    } 
    mapper.map(productForm, product); 
    productService.saveProduct(product); 
    return "redirect:/products/{product}"; 
} 

成功后应该用户重定向回产品的细节。问题是,不是重定向到页面“/ products/1”,我被重定向到页面“/ products/Product [code = 1234567890,name = Nejaky]”。它看起来像placeholder {product}被替换为product.toString(),而不是来自URL的原始ID。 我使用的内置弹簧数据转换器:

<mvc:annotation-driven conversion-service="conversionService"> 
    <mvc:argument-resolvers> 
     <bean class="org.springframework.data.web.PageableHandlerMethodArgumentResolver" /> 
    </mvc:argument-resolvers> 
</mvc:annotation-driven> 

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 

<bean class="org.springframework.data.repository.support.DomainClassConverter"> 
    <constructor-arg ref="conversionService" /> 
</bean> 

我应该怎么做,使之正常工作和重定向我回到“/产品/ 1”没有做这样的事情“重定向:/产品” +产品.getId()?

+0

您的模型中是否有通过ModelAttribute带注释的方法命名为“product”的属性? –

回答

1

我们的故事开始于RedirectView源代码,方法replaceUriTemplateVariables

protected StringBuilder replaceUriTemplateVariables(
     String targetUrl, Map<String, Object> model, Map<String, String> currentUriVariables, String encodingScheme) 
     throws UnsupportedEncodingException { 

    StringBuilder result = new StringBuilder(); 
    Matcher m = URI_TEMPLATE_VARIABLE_PATTERN.matcher(targetUrl); 
    int endLastMatch = 0; 
    while (m.find()) { 
     String name = m.group(1); 
     Object value = model.containsKey(name) ? model.remove(name) : currentUriVariables.get(name); 
     Assert.notNull(value, "Model has no value for '" + name + "'"); 
     result.append(targetUrl.substring(endLastMatch, m.start())); 
     result.append(UriUtils.encodePathSegment(value.toString(), encodingScheme)); 
     endLastMatch = m.end(); 
    } 
    result.append(targetUrl.substring(endLastMatch, targetUrl.length())); 
    return result; 
} 

正如你曾预测,该方法使用value.toString()其中value是在Modelproduct对象。这里没有涉及转换系统等其他组件。您的选项如下:

使用

"redirect:/product" + product.getId() 

添加名为"productId"一个模型属性和使用,在您的视图名称

model.addAttribute("productId", product.getId()); 
"redirect:/product/{productId}" 

或者使用URI变量。我还没有关于这些的信息。

0

好的,终于找到原因。我必须使用@PathVariable注释产品参数。想知道它没有它的工作。

+0

在这种特殊情况下,可能因为产品对象在模型中结束,然后在更换字符串时使用了该对象,但一般来说,您甚至不必将产品作为处理方法中的参数来替换{product }在重定向字符串中工作。 –