0

在我的 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 字段的表单输入?

4

1 回答 1

1

这是论证的顺序实际上很重要的罕见情况之一。该BindingResult参数必须紧跟在您要验证的对象之后。

文档中

您必须在经过验证的方法参数之后立即声明一个错误或 BindingResult 参数。

于 2020-02-06T21:26:48.997 回答