在我的Spring Boot应用程序中,我有一个“ edit user”表单,该表单绑定到SecurityUser bean,但是还有一个用于确认密码的附加(非bean)字段。我的控制器中的GET映射如下所示:
@GetMapping("/security/user/{username}")
public String showEditUserForm(@PathVariable("username") String username, Model model) {
model.addAttribute("securityUser",securityUserService.findByUsername(username));
return "/security/edituser";
}
在POST映射中,我要检查密码确认输入的值并将其与密码字段值进行比较,因此我将其编码为:
@PostMapping("/security/user/{username}")
public String processEditUser(@Valid SecurityUser securityUser, @RequestParam String confirmPassword, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (bindingResult.hasErrors()) {
return "security/edituser";
}
logger.debug(securityUser.toString());
logger.debug(confirmPassword);
redirectAttributes.addFlashAttribute("flashstatus","success");
redirectAttributes.addFlashAttribute("flashmessage","You successfully submitted an edituser form");
return "redirect:/security/success";
}
如果表单有效,则一切正常(允许,这只是日志记录并重定向到成功页面)。但是,如果任何表单字段为[[invalid,则结果为405错误(不支持HTTP方法)。
在日志中是:2020-02-06 15:44:39.114 WARN 20496 --- [nio-8080-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
最初,GET和POST端点是不同的,因此,正如您所看到的,我使它们相同,这显然不是解决方案。如果我从POST映射中删除了@BindingResult变量,则该错误消失了,但是显然我无法检查密码确认。,而不会发生此错误?我如何在Spring Boot POST映射中访问表单输入不是bean字段
BindingResult
参数必须紧接在您要验证的对象之后。 您必须在经过验证的方法参数之后立即声明错误或BindingResult参数。