Spring MVC的重定向与变数(Spring MVC redirect with variabl

2019-09-26 13:46发布

我有以下的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}";
}

成功之后应该重定向回用户对产品的细节。 问题是,而不是重定向到页面“/产品/ 1”我重定向到页面“/产品/产品[代码= 1234567890,名称= Nejaky]”。 它看起来像占位符{产物}由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”没有做这样的事情“重定向:/产品” + product.getId()?

Answer 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是你的product的对象Model 。 像一个转换系统中没有其他成分在这里参与。 您的选项如下:

采用

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

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

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

或者使用URI变量。 我没有对这些信息呢。



Answer 2:

好了,终于找到了原因。 我必须标注产品PARAM与@PathVariable。 想知道它的工作离不开它。



文章来源: Spring MVC redirect with variables