bindingresult必须紧邻@valid或@validated参数之后作为方法形参,用于接收该校验参数的错误信息;它不抛异常,需调用haserrors()等方法主动处理,且多个校验参数需各自配一个bindingresult。

在 Controller 中接收校验结果,关键在于把 BindingResult 作为紧邻被校验参数之后的**方法形参**,且顺序不能错。它不是可选配件,而是校验机制自动注入的“错误收件箱”。
BindingResult 必须紧跟被校验参数
Spring MVC 要求 BindingResult 必须直接跟在使用了 @Valid 或 @Validated 注解的参数后面。如果中间插了其他参数,框架就无法关联校验结果,会抛出异常。
- ✅ 正确写法:
createUser(@Valid @RequestBody UserDTO dto, BindingResult result) - ❌ 错误写法:
createUser(BindingResult result, @Valid @RequestBody UserDTO dto)(顺序颠倒) - ❌ 错误写法:
createUser(@Valid @RequestBody UserDTO dto, String flag, BindingResult result)(中间插入了 flag)
BindingResult 用于检查和提取错误信息
它本身不抛异常,而是把校验失败的细节缓存起来,由你主动读取和处理。
-
result.hasErrors():判断是否有任意字段校验失败 -
result.getFieldErrors():获取所有字段级错误(List),每个包含字段名、错误消息、拒绝值等 -
result.getGlobalErrors():获取对象级校验错误(如 @Valid 嵌套对象或自定义类级别约束) - 常用快捷方式:
result.getFieldError().getDefaultMessage()取第一个错误提示
BindingResult 不是万能兜底,只管当前参数
它只捕获紧邻前一个参数的校验结果。如果方法里有多个带 @Valid 的参数,每个都需要配一个对应的 BindingResult(名字可以不同,但类型必须是 BindingResult 或其子类)。
- 例如:
save(@Valid @RequestBody UserDTO user, BindingResult userResult, @Valid @RequestBody AddressDTO addr, BindingResult addrResult) - 不能共用一个 BindingResult,否则后一个校验结果会覆盖前一个
搭配 @Valid 和 @Validated 的区别注意点
@Valid 是标准 JSR-303 注解,支持嵌套校验(比如 UserDTO 里有个 @Valid Address address 字段);@Validated 是 Spring 扩展,支持分组校验。两者都能触发 BindingResult 收集,但:
- 若在类上加
@Validated,只对本类中明确标注@Valid或@Validated的参数生效,不会自动校验所有参数 - BindingResult 对应的是具体哪个参数,永远取决于它前面那个带校验注解的形参,和类级注解无关











