带有已验证表单bean的Spring Boot POST映射*和* RequestParam在无效表单上给出405错误

问题描述 投票:0回答:1

在我的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字段

,而不会发生此错误?
spring-boot validation post password-confirmation
1个回答
1
投票
这是参数顺序实际上很重要的罕见情况之一。 BindingResult参数必须紧接在您要验证的对象之后。

来自the documentation

您必须在经过验证的方法参数之后立即声明错误或BindingResult参数。
© www.soinside.com 2019 - 2024. All rights reserved.