我有一个简单的场景:
用户提交表单,如果存在绑定错误,我会重新显示它,否则我会设置一个flash属性并重定向到主页。我无法获得命令对象和RedirectAttributes
一起玩,但我可以验证命令对象或使用重定向属性,但不能同时使用两者。这给了我一个400 Bad Request
@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPassword(@AuthenticationPrincipal User currentUser,
@Validated @ModelAttribute("command") SetPasswordCommand command,
RedirectAttributes redirectAttributes,
BindingResult bindingResult) {
if (bindingResult.hasErrors())
return SET_PASSWORD_VIEW_PATH;
...
redirectAttributes.addFlashAttribute("flashMessage", "Password changed");
return "redirect:/";
}
这有效,但没有闪光灯属性:
@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPasswordPost(@AuthenticationPrincipal User currentUser,
@Validated @ModelAttribute("command") SetPasswordCommand command,
BindingResult bindingResult) {
if (bindingResult.hasErrors())
return SET_PASSWORD_VIEW_PATH;
...
return "redirect:/";
}
处理此类事情的推荐模式是什么?
答案 0 :(得分:0)
您的方法签名是错误的,正如here所述,BindingResult
必须直接遵循模型属性。
前一个命令或表单对象的
org.springframework.validation.Errors
/org.springframework.validation.BindingResult
验证结果(紧接在前的方法参数)。
在RedirectAttributes
之后移动BindingResult
会使其有效。
@RequestMapping(value = "/set", method = RequestMethod.POST)
public String setPassword(@AuthenticationPrincipal User currentUser,
@Validated @ModelAttribute("command") SetPasswordCommand command,
BindingResult bindingResult,
RedirectAttributes redirectAttributes) { ... }