Spring Boot 3.5.0与Spring 7.0.0-M5兼容问题:ThemeResolver类找不到求助
Spring 7.0.0-M5 + Spring Boot 3.5.0 测试时出现 ThemeResolver ClassNotFoundException 问题排查
我们使用最新里程碑版本Spring 7.0.0-M5和Spring Boot 3.5.0进行测试,执行测试时出现org.springframework.web.servlet.ThemeResolver的ClassNotFoundException。请问有谁能提供解决该问题的思路?或是这纯粹是版本不兼容,我们操之过急了?
错误堆栈
Caused by: java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.defaultViewResolver at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:100) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:188) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:124) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:446) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:306) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:781) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:599) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1462) at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ... 12 more Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@c387f44] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:479) at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:356) at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:413) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$0(AbstractAutowireCapableBeanFactory.java:751) at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:750) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:684) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:656) at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1696) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:625) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:597) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:582) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanDefinitionsForType(OnBeanCondition.java:322) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanDefinitionsForType(OnBeanCondition.java:314) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:214) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.evaluateConditionalOnMissingBean(OnBeanCondition.java:197) at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:144) at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ... 35 more Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/ThemeResolver at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3402) at java.base/java.lang.Class.getDeclaredMethods(Class.java:2504) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:461) ... 52 more Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.ThemeResolver at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 56 more
Maven BOM配置(简化版)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dachser.framework</groupId> <artifactId>framework.tech.dependencies.bom</artifactId> <version>9.0.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- Spring <spring.version>6.2.7</spring.version>--> <spring.version>7.0.0-M5</spring.version> <spring-security.version>6.5.0</spring-security.version> <spring-boot.version>3.5.0</spring-boot.version> <spring-retry.version>2.0.12</spring-retry.version> <spring-cloud.version>2025.0.0</spring-cloud.version> ... </properties> <dependencyManagement> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-bom</artifactId> <version>${spring-security.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>${spring-retry.version}</version> </dependency> ... </dependencies> </dependencyManagement>
测试类代码
@ActiveProfiles({ "testContextLoads" }) @RunWith(SpringRunner.class) @SpringBootTest(classes = TestConfigurationDefault.class, webEnvironment = WebEnvironment.RANDOM_PORT) @TestPropertySource(properties = { "server.contextPath=/dummy2" }) public class TestContextLoads extends CommonTestCase { @Test public void testMonitoringPath() { AssertPaths.assertDatasourcePath(restTemplate); } }
配置类代码
@Profile("testContextLoads") @Configuration @SpringBootApplication(exclude=DataSourceAutoConfiguration.class) @PropertySource(value = { "multidatabase.properties" }) @EnableTransactionManagement @EnableAspectJAutoProxy @EnableMultiDatabase @EnableDataSourceMonitoring public class TestConfigurationDefault { }
问题分析与解决思路
核心原因:版本不兼容
Spring 7.0.0-M5是里程碑预发布版本,而Spring Boot 3.5.0对应的稳定版Spring Framework是6.2.x系列。两者版本生命周期不匹配:Spring Boot 4.x才会正式适配Spring Framework 7.x。ThemeResolver这类Web MVC核心类在Spring 7.0中可能已被移除、重构或迁移到其他模块,但Spring Boot 3.5.0的自动配置代码仍在依赖旧的类路径,导致类找不到。解决方案
- 最稳妥方案:回退Spring Framework版本到Spring Boot 3.5.0官方适配的版本(比如6.2.7),避免预发布版本的不稳定和兼容性问题。
- 尝鲜方案:如果一定要用Spring 7.0,需搭配对应版本的Spring Boot里程碑版本(如Spring Boot 4.0.0-Mx系列),两者版本节奏是绑定的。
额外检查项
- 确认项目中没有其他依赖强制引入旧版本Spring Web模块,引发类加载冲突。
- 清理Maven本地仓库,重新拉取所有依赖,避免缓存的旧Jar包干扰。
内容的提问来源于stack exchange,提问作者Andrej Flieger
相关产品推荐
相关产品推荐

