Spring Boot 2.4.4引入spring-boot-starter-validation后请求体校验不生效
Spring Boot 2.4.4 接口参数校验未触发的原因与解决方案
常见问题排查与修复
按照问题出现的概率从高到低排列:
- Lombok与校验框架的注解处理顺序不兼容
当前OrganizationDto完全依赖Lombok生成getter、setter方法,没有手动编写属性访问方法。如果Lombok版本与Spring Boot 2.4.4不匹配(低于1.18.20版本),或开发环境未开启注解处理开关,会导致校验框架扫描不到字段上的约束元数据,无法触发校验逻辑。
修复方式:将Lombok版本调整为1.18.20及以上,在IDEA设置的Annotation Processors选项中开启“Enable annotation processing”开关,确保Lombok生成的访问方法能被校验框架识别。 - 类路径下缺失校验实现类
虽然Maven配置了spring-boot-starter-validation依赖,但如果项目存在其他依赖的传递排除规则,把底层的hibernate-validator实现类从类路径中移除,会出现“声明了校验starter但没有实际执行校验的组件”的空配置状态。
修复方式:展开IDEA外部Maven依赖列表,确认类路径下存在org.hibernate.validator:hibernate-validatorJar包;如果缺失,在pom中显式引入与Spring Boot 2.4.4版本匹配的hibernate-validator依赖。 - 请求头格式不匹配导致参数解析流程跳过
@RequestBody参数的解析与校验流程,是和JSON消息转换器绑定的,只有当请求头的Content-Type为application/json时才会触发。如果Postman请求未配置对应请求头,Spring MVC不会走JSON参数解析流程,连带其上挂载的校验逻辑也不会执行。
修复方式:检查Postman请求的Headers配置,确保存在Content-Type: application/json的请求头配置。 - 配置文件禁用了默认校验器
如果配置文件中设置了spring.mvc.validator=none,会完全关闭Spring MVC绑定流程中的校验器组件,导致所有参数校验逻辑不执行。
修复方式:检查配置文件,删除上述禁用校验的配置,保持默认值即可。 - 自定义扩展逻辑拦截了默认参数解析流程
如果项目自定义了参数解析器、请求拦截器,或在过滤器链中提前解析了请求体输入流,会导致Spring MVC默认的RequestResponseBodyMethodProcessor无法正常执行绑定逻辑,直接跳过校验步骤。
修复方式:检查自定义组件的实现逻辑,不要提前读取、消费请求体的输入流,不要替换Spring MVC默认的@RequestBody参数解析流程,确保参数绑定逻辑由Spring MVC默认组件完成。 - DTO注解冗余导致的元数据冲突
当前name字段同时标注了@NotBlank与@NotEmpty两个校验注解,虽然两个注解功能存在重叠,但如果项目中引入了低版本的javax.validation兼容包,会出现注解元数据读取冲突,导致校验流程静默中断。
修复方式:移除冗余注解,String类型字段仅保留@NotBlank即可——该注解会自动校验非null、且去除首尾空格后不为空,比@NotEmpty更适合字符串场景。
校验生效验证方式
完成上述调整后,再次通过Postman发送空值请求,若控制台抛出MethodArgumentNotValidException异常,即代表校验逻辑已正常触发,后续可通过全局异常处理器将校验异常转换为统一格式的接口响应即可。
内容的提问来源于stack exchange,提问作者Ruchin Amaratunga
相关产品推荐
相关产品推荐

