项目场景:
公司旧项目重构,将旧项目从旧框架迁移到新框架中。
环境信息:
Spring Boot: 3.2.9
Hibernate Validator: 6.2.0.Final
一、问题发现
1.1.错误现象
应用启动时抛出 BeanCreationException,具体错误信息:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mvcValidator'
defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]:
Failed to instantiate [org.springframework.validation.Validator]:
Factory method 'mvcValidator' threw exception with message:
javax/validation/valueextraction/ValueExtractorDeclarationException
1.2关键错误信息
根本原因:java.lang.NoClassDefFoundError: javax/validation/valueextraction/ValueExtractorDeclarationException
堆栈特征:错误涉及 Hibernate Validator 的类加载过程
二、原因分析
1.包名冲突分析
通过分析依赖关系,发现关键问题:
// Spring Boot 3.x 期望的包结构
import jakarta.validation.*; // ✅ 正确
import jakarta.validation.valueextraction.ValueExtractorDeclarationException; // ✅ 正确
// 但项目中实际加载的包结构
import javax.validation.*; // ❌ 错误
import javax.validation.valueextraction.ValueExtractorDeclarationException; // ❌ 错误
2.根本原因定位
Spring Boot 3.x 从 Java EE 迁移到 Jakarta EE 导致的包名变更,与旧版本 Hibernate Validator 不兼容。
-
Hibernate Validator 6.x → 基于 Java EE (javax.* 包)
-
Spring Boot 3.x → 基于 Jakarta EE (jakarta.* 包)
-
结果:类加载器找不到 javax.validation.valueextraction.ValueExtractorDeclarationException
三、解决方案:
方案A:移除冲突依赖
<!-- 从 pom.xml 中移除 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
方案B:升级到兼容版本
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
4856

被折叠的 条评论
为什么被折叠?



