Springboot中BindingResult hasErrors始终返回false问题求助
Spring Boot 参数校验不生效排查方案
问题现象
已引入hibernate-validation、spring validation相关依赖,但参数校验功能不生效,
bindingResult.hasErrors()始终返回false,传入lastName为空字符串时未触发@NotBlank校验规则。
现有依赖列表
javax.validation:validation-api:2.0.1.Finalorg.hibernate.validator:hibernate-validator:6.0.18.Finalorg.springframework.boot:spring-boot-starter-validation:2.1.13.RELEASEcom.github.java-json-tools:json-schema-validator:2.2.8io.springfox:springfox-bean-validators:2.9.2
排查解决步骤
- 清理重复依赖,解决版本冲突
spring-boot-starter-validation已经内置了适配当前Spring Boot版本的validation-api和hibernate-validator,手动额外引入的两个校验依赖大概率和starter内置版本不兼容。先移除手动引入的javax.validation:validation-api和org.hibernate.validator:hibernate-validator,仅保留starter依赖即可。 - 检查校验注解包导入是否正确
确认MyClass类中@NotBlank注解导入的是javax.validation.constraints.NotBlank,而非第三方包下的同名注解,避免注解不被标准校验器识别。 - 检查实体类字段访问权限
校验器需要通过Getter方法读取字段值进行校验,如果MyClass仅使用了Lombok的@Builder注解,未添加@Getter/@Data注解,私有字段无法被校验器访问,会直接跳过校验。需要给MyClass补充对应字段的Getter方法,或添加Lombok的@Getter注解。 - 确认BindingResult参数位置正确
BindingResult必须紧跟在被@Valid修饰的参数之后,中间不能插入其他参数,否则Spring无法将校验结果注入到BindingResult对象中。当前代码参数顺序是正确的,若后续调整参数需要注意该规则。 - 检查WebMvc配置是否覆盖默认校验逻辑
如果项目中存在自定义WebMvcConfigurer实现类,检查是否重写了getValidator()、configureMessageConverters()等方法,若手动配置了消息转换器或校验器,没有正确注入标准LocalValidatorFactoryBean,会导致@RequestBody参数校验失效。如果没有特殊需求,不要重写上述方法,保留Spring Boot自动配置即可。 - 排查第三方依赖冲突
暂时移除io.springfox:springfox-bean-validators依赖后重试校验,低版本的swagger校验扩展包会和Spring Boot原生校验逻辑产生冲突。如果移除后校验生效,可以升级该依赖版本,或者排除该包传递引入的校验相关依赖。 - 断点确认反序列化结果
在控制器方法入口打断点,查看myClass的lastName字段实际值,确认JSON反序列化时没有把空字符串转为null,排除反序列化配置导致的校验条件不匹配问题。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

