Spring Boot项目引入Hibernate Validator仍报NoProviderFoundException如何解决
问题根因
你遇到的是Jakarta EE与Java EE包命名不兼容导致的Provider加载失败,具体冲突点如下:
- Hibernate Validator 7.x 是Jakarta EE 9+规范的实现,所有校验相关包名已从
javax.validation改为jakarta.validation,与你引入的javax.validation-api 2.0.1完全不匹配,因此标准Validation API无法扫描到可用的实现类。 - 你额外手动引入的
validation-api和hibernate-validator属于冗余依赖,spring-boot-starter-validation本身已经内置了和当前Spring Boot版本适配的校验API和Hibernate Validator实现,手动指定版本极易出现兼容性问题。
解决方案
情况1:使用Spring Boot 2.x版本(基于Java EE,默认使用javax包)
- 移除你手动添加的两个独立依赖,仅保留
spring-boot-starter-validation即可:
<!-- 仅保留这个依赖即可 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- 如果你必须手动指定Hibernate Validator版本,请选择6.x系列版本(最后一个兼容javax包的大版本),例如:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency>
情况2:使用Spring Boot 3.x版本(基于Jakarta EE,默认使用jakarta包)
- 同样先移除手动添加的两个独立依赖,仅保留
spring-boot-starter-validation,它会自动引入适配Jakarta规范的校验API和Hibernate Validator 7+实现。 - 修改代码中所有校验相关类的导入路径,把
javax.validation.*替换为jakarta.validation.*。
优化建议
不需要手动调用Validation.buildDefaultValidatorFactory()构建Validator实例,Spring容器已经自动初始化了全局可用的Validator,直接注入即可使用:
@Autowired private Validator validator; public void validateUser(User user) { Set<ConstraintViolation<User>> violations = validator.validate(user); }
修改完成后执行mvn clean install -U刷新依赖,重启应用即可解决异常。
内容的提问来源于stack exchange,提问作者Piotr Chabros
相关产品推荐
相关产品推荐

