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

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版本,而是针对应用运行和测试两个阶段分别配置:

  1. 应用运行阶段:强制锁定Servlet 5.0.0版本,适配现有环境
  2. 测试阶段:放开版本限制,让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:43:15