升级Java/Spring/Spark版本后本地测试遇javax.validation.ValidatorFactory类缺失问题
技术栈升级后本地测试出现
javax.validation.ValidatorFactory缺失错误 背景
原技术栈:Java 8、Spring 2.7、Spark 3.3、Scala 2.12
升级后技术栈:Java 17、Spring 3.1.2、Spark 3.5.0、Scala 2.12
应用在K8s环境运行正常,但本地测试时抛出如下错误:
class file for javax.validation.ValidatorFactory not found
错误触发自以下配置类方法:
@Bean @ConditionalOnMissingBean(Validator.class) public LocalValidatorFactoryBean validator(MessageSource messageSource) { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.setValidationMessageSource(messageSource); return validator; }
已完成的操作:
- 将校验相关导入从
javax.validation迁移至jakarta.validation,例如:import jakarta.validation.Validator; - 尝试添加Hibernate Validator依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>8.0.1.Final</version> </dependency>
- 尝试切换
jakarta.validation-api版本为2.0.2或3.0.2,问题仍未解决
当前pom.xml相关依赖片段:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>3.1.2</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vault-config</artifactId> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.version}</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql-kafka-0-10_${scala.version}</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
解决方案
1. 排查并排除javax.validation依赖冲突
Spring Boot 3.x基于Jakarta EE 9,所有javax.*校验API需完全替换为jakarta.*。执行命令查看依赖树,找出仍引入javax.validation-api的依赖:
mvn dependency:tree | grep javax.validation
找到对应依赖后添加排除规则,示例:
<exclusion> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </exclusion>
2. 移除重复的Hibernate Validator依赖
Spring Boot 3.1.2的spring-boot-starter-validation已默认引入适配的jakarta.validation-api:3.0.2和hibernate-validator:8.0.1.Final,手动重复添加会导致版本冲突,直接删除手动配置的Hibernate Validator依赖即可。
3. 确认LocalValidatorFactoryBean的导入包
确保使用Spring 3.x适配的Jakarta版本导入:
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
4. 清理本地Maven缓存
K8s运行正常但本地报错,大概率是本地缓存了旧版依赖。执行命令清理缓存并重新构建:
mvn clean install -U
5. 排除Spark依赖中的旧版校验API
Spark 3.5.0部分依赖未完全迁移到Jakarta,需在Spark相关依赖中添加排除:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.version}</artifactId> <scope>provided</scope> <exclusions> <exclusion> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql-kafka-0-10_${scala.version}</artifactId> <exclusions> <exclusion> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者maxime G
相关产品推荐
相关产品推荐

