Spring验证器注释和错误重定向

时间:2015-03-06 21:57:27

标签: java spring validation spring-mvc

我实际上正在使用Spring Boot和Sprint MVC学习Spring框架。 我正在做一个发布一些数据来完成一个对象的表单,我需要验证一些值。

事实上,验证工作,事实上,如果我不尊重验证,我会重新定向" (事实上​​,URL并没有改变)到error.html内容。

如何正确管理重定向?这不会这样做:

@RequestMapping(value = "/print", method = RequestMethod.POST)
    public String printPost(@ModelAttribute("printerentity") @Valid PrinterEntity print, Model model, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "redirect:/formPrinter";
        }

        model.addAttribute("printed", print.getName());
        model.addAttribute("printerentity", new PrinterEntity());

        return "index";
    }

形式:

<form method="post" th:action="@{/print}" th:object="${printerentity}">
    <input type="text" th:field="*{name}"/>
    <button type="submit">Valider</button>

    <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</p>
</form>

我做错了什么?

编辑:似乎当我有错误时,我没有传递控制器代码:o =&gt;

 @RequestMapping(value = "/print", method = RequestMethod.POST)
    public String printPost(@ModelAttribute("printerentity") @Valid PrinterEntity print, Model model, BindingResult bindingResult) {
        System.out.println("I dont passe here when error but I m redirected");
        if (bindingResult.hasErrors()) {
            return "formPrinter";
        }

        model.addAttribute("printed", print.getName());
        model.addAttribute("printerentity", new PrinterEntity());

        return "index";
    }

感谢提前

2 个答案:

答案 0 :(得分:1)

  

我该如何正确管理我的重定向?

当您重定向请求时,当前请求被销毁,并且创建了一个新的请求对象来处理请求,因此根据Sotirios Delimanolis在评论中提到的,模型属性是请求属性,可用于每个请求only,如果要在请求之间的HTTP会话中存储模型属性,请使用@SessionAttributesFlashAttributes

根据您的html表单,您有:

<p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</p>

您的意思是您希望在同一页面中显示验证错误,然后不要重定向返回相同的视图。

if (bindingResult.hasErrors()) {
    //return "redirect:/formPrinter";
    return "your html form view";
}

然后,在您的视图中,您可以呈现所有验证错误消息,如:

<p th:each="err : ${#fields.errors('*')}" th:text="${err}"></p> 

答案 1 :(得分:0)

我遇到了同样的问题,通过将我的@PostMapping 方法中的参数重新排序为 (@Valid @ModelAttribute Form form, BindingResult bindingResult, Model model) 解决了

当参数与您的控制器(@Valid @ModelAttribute 表单、模型模型、BindingResult bindingResult)的顺序相同时,我也被重定向到 /error 而没有调用控制器 @PostMethod。