项目场景:

公司旧项目重构,将旧项目从旧框架迁移到新框架中。
环境信息:
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>
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐