You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Spring Boot 2时遇NoSuchMethodError与NoClassDefFoundError问题求助

解决Spring Boot 2升级后的NoSuchMethodError(Validation相关)

这个问题我之前帮好几个开发者排查过,核心原因就是依赖版本冲突——你的classpath里混进了不兼容的Validation API版本,导致Spring的LocalValidatorFactoryBean找不到预期的方法。

先给你拆解下错误的本质:

Caused by: java.lang.NoSuchMethodError: javax.validation.Configuration.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;

这个getDefaultParameterNameProvider()方法是Validation API 1.1里的定义,但在Validation API 2.0中已经被替换成了带上下文参数的重载版本。而Spring Boot 2.x(搭配Spring 5.x)是完全针对Validation API 2.0设计的,现在出现这个错误,说明你的项目里同时存在旧版Validation API(1.x)和新版(2.0.1),类加载时优先加载了旧版,导致Spring代码调用新版方法时找不到。

下面是具体的解决步骤:

  • 移除手动指定的Validation版本,交给Spring Boot自动管理
    Spring Boot的spring-boot-starter-parent已经为所有常用依赖定义了经过验证的兼容版本号,包括Hibernate Validator和Validation API。你只需要引入spring-boot-starter-validation即可,不需要手动指定validation-apihibernate-validator的版本:

    <!-- 如果项目还没继承Spring Boot Parent,先添加这个 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version> <!-- 对应你使用的Spring Boot 2版本 -->
        <relativePath/>
    </parent>
    
    <!-- 仅需这一个依赖,自动引入兼容的Validation API和Hibernate Validator -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
  • 检查并排除冲突的旧依赖
    如果你必须保留某些自定义依赖,先排查依赖树,找出引入旧版Validation API的来源:

    • Maven执行命令:mvn dependency:tree
    • Gradle执行命令:./gradlew dependencies

    找到包含javax.validation:validation-api:1.x的依赖后,在pom.xml或build.gradle中排除它:

    <dependency>
        <groupId>你的依赖groupId</groupId>
        <artifactId>你的依赖artifactId</artifactId>
        <exclusions>
            <exclusion>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 验证最终依赖版本
    处理完成后,再次查看依赖树,确保classpath中只有validation-api:2.0.1hibernate-validator:6.0.9(或Spring Boot对应版本的兼容版本)存在。

按照这几步操作,应该就能彻底解决这个NoSuchMethodError问题了。

内容的提问来源于stack exchange,提问作者Philip George

火山引擎 最新活动