添加Swagger配置文件后Spring Boot测试失败,报错缺失HttpServletRequest
在Spring Boot应用中添加Swagger配置文件后,所有测试均失败,此前测试运行正常。
Swagger配置文件
@Configuration @EnableOpenApi public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .select() .apis(RequestHandlerSelectors.basePackage("com.example.demo")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("My Awesome API") .description("Description for my awesome API") .version("1.0") .termsOfServiceUrl("https://www.example.com/terms-of-service") .license("License: MIT") .licenseUrl("https://opensource.org/licenses/MIT") .build(); } }
项目POM依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.maxmind.geoip2</groupId> <artifactId>geoip2</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <version>3.4.8</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> </dependencies>
核心报错信息
java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
已尝试的无效解决方案
添加以下依赖后问题未解决:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
问题原因及解决方法
原因分析
项目同时引入了spring-boot-starter-web(Servlet栈)和spring-boot-starter-webflux(响应式Reactor栈),Spring Boot在混合场景下会自动切换为Reactor Web环境,不会加载Servlet相关依赖。而Springfox 3.0.0的Swagger依赖基于Servlet环境开发,因此出现找不到javax.servlet.http.HttpServletRequest类的错误。
另外,手动添加的javax.servlet:servlet-api:2.5是低版本Servlet API,Spring Boot已通过starter管理依赖版本,该依赖不仅无法解决问题,还可能引发版本冲突,建议删除。
解决方案
方案1:若项目为响应式WebFlux应用
替换Springfox为支持WebFlux的SpringDoc OpenAPI,删除原有的springfox-boot-starter依赖,添加以下依赖:
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webflux-ui</artifactId> <version>2.2.0</version> </dependency>
同时删除手动编写的SwaggerConfig类,SpringDoc会自动完成Swagger配置。
方案2:若项目为传统Servlet Web应用
直接移除spring-boot-starter-webflux依赖,Spring Boot会默认使用Servlet环境,此时原有的Swagger配置和springfox-boot-starter依赖可正常工作,无需额外添加Servlet API依赖(spring-boot-starter-web已包含对应依赖)。
内容的提问来源于stack exchange,提问作者asd

