首页 > 解决方案 > 无效的表单输入会抛出 Bad Request 而不进入 springboot 控制器的方法。怎么处理?

问题描述

我有一个带有经过验证的表单参数的控制器:

@PostMapping("/report")
public String reportSubmit(@Valid @ModelAttribute HomeFormInput homeFormInput, Model model, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "home";
    }

该表单包含一个具有验证规则的输入字段:

@Data
public class HomeFormInput {
    @NotEmpty(message = "You must provide at least one id")
    String input;
    String email;
}

当我尝试通过将 id 字段留空来对其进行测试时,它会抛出 BAD REQUEST 并且甚至不会进入控制器的方法(我试图调试它)。日志说以下内容:

2021-01-17 20:32:51.705 调试 20412 --- [nio-8080-exec-2] swsmmaRequestMappingHandlerMapping:映射到 com.fiserv.report.generator.controller.ReportController#homeSubmit(HomeFormInput, Model, BindingResult) 2021- 01-17 20:32:51.789 调试 20412 --- [nio-8080-exec-2] .wsmmaServletInvocableHandlerMethod:无法解析公共 java.lang.String com.fiserv.report.generator.controller.ReportController 中的参数 [0] .homeSubmit(com.fiserv.report.generator.model.HomeFormInput,org.springframework.ui.Model,org.springframework.validation.BindingResult): org.springframework.validation.BeanPropertyBindingResult: 1 对象'homeFormInput'上的错误字段错误字段'输入':拒绝值[];代码 [NotEmpty.homeFormInput.input,NotEmpty.input,NotEmpty.java.lang.String,NotEmpty]; 论据 [org.springframework.context.support。DefaultMessageSourceResolvable: 代码 [homeFormInput.input,input]; 论据 []; 默认消息[输入]];默认消息 [您必须提供至少一个测试计划 ID] 2021-01-17 20:32:51.791 WARN 20412 --- [nio-8080-exec-2] .wsmsDefaultHandlerExceptionResolver : 已解决 [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult:1 个错误字段“输入”上的对象“homeFormInput”中的字段错误:拒绝值 [];代码 [NotEmpty.homeFormInput.input,NotEmpty.input,NotEmpty.java.lang.String,NotEmpty]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [homeFormInput.input,input]; 论据 []; 默认消息[输入]];默认消息 [您必须提供至少一个测试计划 id]] 2021-01-17 20:32:51.791 DEBUG 20412 --- [nio-8080-exec-2] osweb。

如何让它进入处理验证错误的方法?

标签: spring-bootjavax.validation

解决方案


事实证明,控制器参数列表的变化起到了作用——我从参数列表中删除了模型,它现在就像魅力一样。所以控制器的最终签名如下所示:

@PostMapping("/report")
public String reportSubmit(@Valid @ModelAttribute HomeFormInput homeFormInput, BindingResult bindingResult) {
...
}

这是文档中的重要部分

Errors, BindingResult 用于访问来自命令对象(即@ModelAttribute 参数)的验证和数据绑定的错误或来自@RequestBody 或@RequestPart 参数验证的错误。您必须在经过验证的方法参数之后立即声明一个错误或 BindingResult 参数。


推荐阅读