升级Spring Boot 2时遇NoSuchMethodError与NoClassDefFoundError问题求助
这个问题我之前帮好几个开发者排查过,核心原因就是依赖版本冲突——你的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-api或hibernate-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>- Maven执行命令:
验证最终依赖版本
处理完成后,再次查看依赖树,确保classpath中只有validation-api:2.0.1和hibernate-validator:6.0.9(或Spring Boot对应版本的兼容版本)存在。
按照这几步操作,应该就能彻底解决这个NoSuchMethodError问题了。
内容的提问来源于stack exchange,提问作者Philip George




