Spring Boot项目@Valid注解不生效 接口未返回预期4xx客户端错误
核心故障原因
你遇到的是校验包命名空间不兼容问题:
Spring Boot 2.5.3属于2.x版本分支,默认适配Java EE规范,使用javax.validation.*包下的校验相关注解与API;而你引入的hibernate-validator:7.0.1.Final属于Hibernate Validator 7.x版本,是适配Jakarta EE 9规范的版本,所有校验相关的包名已经全部迁移为jakarta.validation.*,两者完全不兼容。
这就导致Spring MVC的校验逻辑完全识别不到CAReportDTO上的校验注解,参数校验流程直接跳过,接口始终返回200状态码。
解决方案
方案1(推荐,改动最小):降级独立依赖库的Hibernate Validator版本
将定义CAReportDTO的独立库中Hibernate Validator版本降到6.x分支,该分支仍使用javax.validation包名,和Spring Boot 2.5.3完全兼容。
建议直接使用Spring Boot 2.5.x依赖管理默认定义的版本,不需要手动指定版本号:
// 移除原7.0.1.Final的显式版本声明,直接引入依赖即可 group: 'org.hibernate.validator', name: 'hibernate-validator'
如果独立库是Maven项目,同样不要给hibernate-validator加<version>标签,父pom的依赖管理会自动匹配兼容版本。
方案2(改动较大):升级Spring Boot版本适配Jakarta规范
如果必须使用Hibernate Validator 7.x版本,需要将主项目的Spring Boot版本升级到3.x分支,同时将所有代码中javax.validation的引用全部替换为jakarta.validation,包括控制器上@Valid注解的包导入。
额外检查项
完成版本适配后如果仍有问题,可以排查以下配置:
- 确认控制器中
@Valid的导入包为javax.validation.Valid,不要误导入其他包下的同名注解 - 确认项目没有自定义WebMvc配置关闭了请求参数校验功能
- 如果DTO包含嵌套对象需要校验,要在嵌套对象的字段上额外添加
@Valid注解触发级联校验
内容的提问来源于stack exchange,提问作者KellyM

