繁体   English   中英

Spring 带变量的 MVC 重定向

[英]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() ,其中valueModel 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM