Spring Boot 3.1.4+JUnit测试遇jakarta.servlet.ServletConnection缺失问题
解决Spring Boot 3.1.4 + Servlet 5.0.0的JUnit测试版本冲突问题
问题根源
Spring Boot 3.1.4默认依赖Jakarta Servlet 6.0,但你的环境被限制使用5.0.0版本。jakarta.servlet.ServletConnection是Servlet 6.0新增的类,全局强制Servlet 5.0.0时,测试依赖(比如spring-boot-starter-test)里的组件会尝试加载这个不存在的类,导致测试报错;移除全局强制后,应用运行时会用Servlet6,和现有环境不兼容导致启动失败。
解决方案:分场景控制依赖版本
不用全局强制Servlet版本,而是针对应用运行和测试两个阶段分别配置:
- 应用运行阶段:强制锁定Servlet 5.0.0版本,适配现有环境
- 测试阶段:放开版本限制,让Spring Boot测试框架使用适配的Servlet版本
具体Gradle配置修改
plugins { id 'org.springframework.boot' version '3.1.4' id 'io.spring.dependency-management' version '1.1.3' id 'java' } configurations { // 应用运行时强制使用Servlet 5.0.0及对应版本的Tomcat implementation { resolutionStrategy { force 'jakarta.servlet:jakarta.servlet-api:5.0.0' force 'org.apache.tomcat.embed:tomcat-embed-core:10.1.13' // Tomcat 10.1.x对应Servlet 5.0 force 'org.apache.tomcat.embed:tomcat-embed-websocket:10.1.13' } } // 测试阶段不强制Servlet版本,允许测试框架使用适配的依赖 testImplementation { resolutionStrategy { // 若仍有冲突,可主动排除测试依赖中的Servlet 6.0包 exclude group: 'jakarta.servlet', module: 'jakarta.servlet-api' } } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() }
验证步骤
- 执行
./gradlew dependencies,分别查看implementation和testImplementation下的Servlet依赖版本,确认运行时是5.0.0,测试时为Spring Boot 3.1.4默认适配版本 - 若测试仍报错,检查测试类是否使用了依赖Servlet6的组件,可替换为
@WebMvcTest或@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK),避免加载真实Servlet容器
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

