[英]Spring MVC redirect with variables
我有以下 Spring MVC 3.2.4 方法:
@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]”。 看起来占位符 {product} 被 product.toString() 代替了 URL 的原始 ID。我正在使用内置的 Spring 数据转换器:
<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>
我应该怎么做才能使其正常工作并将我重定向回“/products/1”而不执行“redirect:/product”+ product.getId()之类的事情?
我们的故事始于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
是Model
product
对象。 这里没有涉及转换系统之类的其他组件。 您的选择如下:
采用
"redirect:/product" + product.getId()
添加一个名为"productId"
的模型属性,并在您的视图名称中使用
model.addAttribute("productId", product.getId());
"redirect:/product/{productId}"
或使用uri变量。 我还没有这些信息。
好的,终于找到了原因。 我必须使用@PathVariable注释产品参数。 想知道没有它会起作用。
我知道这是一个老问题,但对于任何面临同样问题的人来说,这里就是答案
只需将 RedirectAttributes 注入您的 controller 并使用redirectAtrr.addAttribute([attrbuteName],[attributeValue])
@RequestMapping(value = "/products/{product}", method = RequestMethod.POST)
public String update(Product product,@Valid,@ModelAttribute("productForm") ProductForm productForm,BindingResult bindingResult,Model model,RedirectAttributes redirectAttr) {
if (bindingResult.hasErrors()) {
return "products/view";
}
mapper.map(productForm, product);
productService.saveProduct(product);
redirectAttr.addAttributte("productId",product.getId());
return "redirect:/products/{productId}";
}
阅读文档以获得更多理解。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.