You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1升级至3.3出现NoClassDefFoundError: RestTemplateExchangeTagsProvider

RestTemplateExchangeTagsProvider类缺失导致Spring Boot启动失败

我发现该错误源自自动配置,但不清楚如何解决。注意到RestTemplateExchangeTagsProvider类已被弃用并移除,但不知道是哪个依赖在调用它。

错误日志

2024-05-14T17:49:47.222Z ERROR 1 --- [           main] o.s.boot.SpringApplication               : Application run failed
 
java.lang.IllegalStateException: Error processing condition on org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration
 at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDefinitionReader.java:470) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator.shouldSkip(ConfigurationClassBeanDefinitionReader.java:459) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:131) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:788) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606) ~[spring-context-6.1.6.jar!/:6.1.6]
 at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.5.jar!/:3.2.5]
 at com.tmobile.steelthread.tfbbulkpublisher.TfbBulkPublisherApplication.main(TfbBulkPublisherApplication.java:20) ~[!/:1.0.31]
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
 at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
 at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:91) ~[app.jar:1.0.31]
 at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53) ~[app.jar:1.0.31]
 at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58) ~[app.jar:1.0.31]
Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.actuate.autoconfigure.observation.web.client.RestTemplateObservationConfiguration] from ClassLoader [org.springframework.boot.loader.launch.LaunchedClassLoader@50040f0c]
 at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483) ~[spring-core-6.1.6.jar!/:6.1.6]
 at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:360) ~[spring-core-6.1.6.jar!/:6.1.6]
 at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:417) ~[spring-core-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$1(AbstractAutowireCapableBeanFactory.java:750) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na]
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:749) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:682) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:653) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1676) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:562) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:534) ~[spring-beans-6.1.6.jar!/:6.1.6]
 at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:247) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:240) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:230) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:183) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:120) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-3.2.5.jar!/:3.2.5]
 ... 25 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/actuate/metrics/web/client/RestTemplateExchangeTagsProvider
 at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
 at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3402) ~[na:na]
 at java.base/java.lang.Class.getDeclaredMethods(Class.java:2504) ~[na:na]
 at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465) ~[spring-core-6.1.6.jar!/:6.1.6]
 ... 41 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.actuate.metrics.web.client.RestTemplateExchangeTagsProvider
 at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[na:na]
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592) ~[na:na]
 at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.loadClass(JarUrlClassLoader.java:104) ~[app.jar:1.0.31]
 at org.springframework.boot.loader.launch.LaunchedClassLoader.loadClass(LaunchedClassLoader.java:91) ~[app.jar:1.0.31]
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]
 ... 45 common frames omitted

解决方法

1. 定位引用旧类的依赖

用依赖分析工具找出哪个依赖还在调用RestTemplateExchangeTagsProvider:

  • Maven执行:mvn dependency:tree | grep -i metrics
  • Gradle执行:./gradlew dependencies | grep -i metrics

2. 升级兼容Spring Boot 3.x的依赖

RestTemplateExchangeTagsProvider在Spring Boot 3.x中已被移除,替换为基于Observation的API:

  • 若自定义代码引用了该类,替换为RestTemplateObservationConvention相关实现
  • 确保所有Spring Boot Actuator相关依赖版本和项目的Spring Boot版本(3.2.5)保持一致

3. 排除冲突依赖

如果第三方依赖引入了旧版本的actuator metrics模块,直接在依赖声明中排除:
Maven示例:

<dependency>
    <groupId>第三方依赖组ID</groupId>
    <artifactId>第三方依赖 artifactID</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-metrics</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle示例:

implementation('第三方依赖组ID:第三方依赖artifactID') {
    exclude group: 'org.springframework.boot', module: 'spring-boot-actuator-metrics'
}

4. 临时禁用相关自动配置

若暂时无法升级依赖,可在配置文件中禁用引发问题的自动配置类:

spring.autoconfigure.exclude=org.springframework.boot.actuate.autoconfigure.observation.web.client.RestTemplateObservationConfiguration

内容的提问来源于stack exchange,提问作者Sumama Waheed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:02:05