我实际上正在使用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";
}
感谢提前
答案 0 :(得分:1)
我该如何正确管理我的重定向?
当您重定向请求时,当前请求被销毁,并且创建了一个新的请求对象来处理请求,因此根据Sotirios Delimanolis在评论中提到的,模型属性是请求属性,可用于每个请求only,如果要在请求之间的HTTP会话中存储模型属性,请使用@SessionAttributes或FlashAttributes。
根据您的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。