2013-10-09 40 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 }在重定向字符串中工作。 –