spring-boot - 无效的表单输入会抛出 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。
如何让它进入处理验证错误的方法?
解决方案
事实证明,控制器参数列表的变化起到了作用——我从参数列表中删除了模型,它现在就像魅力一样。所以控制器的最终签名如下所示:
@PostMapping("/report")
public String reportSubmit(@Valid @ModelAttribute HomeFormInput homeFormInput, BindingResult bindingResult) {
...
}
这是文档中的重要部分
Errors, BindingResult 用于访问来自命令对象(即@ModelAttribute 参数)的验证和数据绑定的错误或来自@RequestBody 或@RequestPart 参数验证的错误。您必须在经过验证的方法参数之后立即声明一个错误或 BindingResult 参数。
推荐阅读
- cassandra - 如何在具有 SAI 索引的 TEXT 列上使用 CONTAINS?
- c# - 如何在 .NET 中使用 OData 客户端处理未知类方案
- python - 将数据框列中的列表应用于另一列
- gcc - GCC [for ARM] 强制无浮点
- javascript - 映射数组以查找属于不同对象的子数组中元素的总和
- c# - 如何使用带有初始化属性的 Bogus Faker?
- python - Numpy 中 np.int64(x) 和 x.astype(np.int64) 的区别
- python-3.x - Discordpy 欢迎机器人
- iframe - iframe 元素在 Windows 浏览器上显示视频正常,但在 IOS 上不显示
- asp.net - Google Chrome 不显示来自 asp.net 页面的 PDF