在我的 Spring Boot 应用程序中,我有一个“编辑用户”表单,该表单绑定到一个 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";
}
如果表单有效,则一切正常(当然,它只是记录并重定向到成功页面)。但是,如果任何表单字段无效,则会导致 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 字段的表单输入?