Tomcat10运行Jersey3+Hibernate项目报ValidatorFactory类未找到错误
问题根因
- Jersey 3.0.3属于Jakarta EE 9+版本生态,所有Java EE规范包命名已经从
javax.*迁移到了jakarta.*,如果项目依赖的Hibernate版本较旧,仍然在使用javax.validation相关API,两者包命名不兼容会导致类加载失败。 - Tomcat 10.0也是基于Jakarta EE 9规范实现,本身默认不提供
javax.validation的实现包,若项目未显式引入对应依赖,运行时就会抛出类不存在的异常。 - JDK 8本身没有内置Bean Validation的API包,需要额外引入相关依赖。
解决方案
提供两种适配思路,可根据项目实际情况选择:
方案一:适配新规范(推荐,兼容现有Jersey 3.x + Tomcat 10环境)
- 升级Hibernate到支持Jakarta EE的版本,选择Hibernate ORM 5.6+、Hibernate Validator 7.0+即可,这部分版本已经把API包名迁移到
jakarta.validation.*,和Jersey 3.x、Tomcat 10的包命名完全一致。 - 在pom.xml中显式引入Jakarta Bean Validation的API和实现依赖:
<!-- Jakarta Bean Validation API --> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>3.0.2</version> </dependency> <!-- Hibernate Validator 实现 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>7.0.5.Final</version> </dependency> <!-- 表达式语言依赖,Bean Validation 运行时必需 --> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.el</artifactId> <version>4.0.2</version> </dependency>
- 检查persistence.xml等配置文件、Java代码中的导入语句,把所有
javax.validation相关的导入替换为jakarta.validation。
方案二:降级环境适配旧规范
如果暂时不想升级Hibernate版本,可降级运行环境适配旧的Java EE规范:
- 把Jersey版本降级到2.x系列(比如2.41),2.x版本仍使用
javax.*命名规范 - 把Tomcat版本降级到9.x版本,Tomcat 9是Java EE 8规范的实现,兼容
javax.*包名 - 在pom.xml中显式引入旧版Bean Validation依赖:
<!-- Java Bean Validation API --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!-- Hibernate Validator 旧版本实现 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b12</version> </dependency>
验证操作
修改依赖后执行mvn clean package重新打包项目,清理Tomcat的work目录和webapps下的旧部署包后再重新部署,也可以直接检查部署后项目的WEB-INF/lib目录下是否存在对应validation相关jar包,排查依赖冲突问题。
内容的提问来源于stack exchange,提问作者lyly
相关产品推荐
相关产品推荐

