从 JDK 1.8 升级到 JDK 21 后报错javax.validation.NoProviderFoundException

2025年9月11日 by admin

JDK 1.8 升级到 JDK 21 后 NoProviderFoundException 错误:

javax.validation.NoProviderFoundException: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.     at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:291) ~[jakarta.validation-api-2.0.2.jar:?]

这个错误表明,应用程序无法找到 Jakarta Bean Validation 的提供者(例如 Hibernate Validator),从 JDK 1.8 升级到 JDK 21 后,可能发生了兼容性或依赖冲突问题。

要解决这个问题,你可以按以下步骤操作:

  1. 添加 Hibernate Validator 依赖
    确保项目中包含了 Jakarta Bean Validation 提供者,如 Hibernate Validator。你可以在 pom.xml 中添加以下依赖(如果是使用 Maven):
   <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-validator</artifactId>
       <version>7.0.4.Final</version> <!-- 或使用其他兼容的版本 -->
   </dependency>

或者如果你使用的是 Gradle:

   dependencies {
       implementation 'org.hibernate:hibernate-validator:7.0.4.Final' // 或其他版本
   }
  1. 确保 Jakarta API 兼容
    在 JDK 9 及以上版本中,javax.validation 包已被迁移为 jakarta.validation,因此,你需要确保使用的是 Jakarta 版本的 Bean Validation API(jakarta.validation-api)而不是 javax.validation-api。 如果你还没有添加 jakarta.validation-api,请确保在 pom.xml 中也有这个依赖:
   <dependency>
       <groupId>jakarta.validation</groupId>
       <artifactId>jakarta.validation-api</artifactId>
       <version>2.0.2</version>
   </dependency>
  1. 检查版本兼容性
    JDK 21 可能与旧版的验证库存在兼容性问题。确保 Hibernate Validator 和 Jakarta Bean Validation API 版本与 JDK 21 兼容。如果需要,参考这些库的文档或 GitHub 仓库,确认哪些版本是与 JDK 21 兼容的。
  2. 清除本地仓库缓存
    有时,Maven 或 Gradle 本地缓存的旧版本库可能会导致问题。可以尝试清理本地缓存,然后重新构建项目: 对于 Maven,使用:
   mvn clean install -U

对于 Gradle,使用:

   gradle clean build --refresh-dependencies
  1. 检查类路径
    确保应用程序的类路径中包含了 hibernate-validatorjakarta.validation-api,并且没有版本冲突。

这些步骤应该能够帮助你解决 NoProviderFoundException 错误。