使用SpringDoc WebFlux支持时无法显示Swagger/OpenAPI文档
看起来你遇到的核心问题是同时引入了Servlet和Reactive Web依赖导致的容器冲突,再加上版本适配的小细节问题,咱们一步步来解决:
1. 移除冲突的Web依赖
你当前的依赖里同时包含了spring-boot-starter-web(Servlet栈)和spring-boot-starter-webflux(Reactive栈),这在Spring Boot里是大忌——Spring Boot会默认优先启用Servlet容器(比如Tomcat),但WebFlux的组件和SpringDoc的WebFlux适配在Servlet环境下会出现类加载冲突,直接导致了ServerHttpRequest接口无法实例化的500错误(接口本来就没有构造器,反射调用当然会失败)。
立刻从你的Gradle配置中移除spring-boot-starter-web,保留WebFlux相关依赖即可:
implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-webflux' // 只保留WebFlux版本的SpringDoc依赖 implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.4'
2. 验证版本兼容性
Spring Boot 2.3.3.RELEASE和springdoc-openapi-webflux-ui:1.4.4是兼容的,但如果后续还有小问题,可以尝试升级SpringDoc到1.5.10(这个版本对Spring Boot 2.3.x的支持更完善)。
3. 正确访问Swagger UI
移除冲突依赖后,重启应用,直接访问http://localhost:8080/swagger-ui.html就能正常打开了。之前的404问题是因为错误的URL参数,WebFlux版本的Swagger UI会自动加载配置,不需要手动指定configUrl。
4. 修复响应式端点的Schema显示问题
如果移除Web依赖后,返回Mono<T>的端点还是无法显示Schema,试试这几个办法:
- 确保你的返回类型
T是具体的POJO类,并且有完整的getter/setter(用Lombok的@Data注解能省不少事); - 在控制器方法上显式标注返回Schema,比如:
@GetMapping("/your-endpoint") @Operation(summary = "获取数据", responses = { @ApiResponse(responseCode = "200", description = "请求成功", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = YourPojo.class))) }) public Mono<YourPojo> getData() { return yourService.fetchData(); }
- 检查SpringDoc是否扫描到了你的控制器:可以在启动类上添加
@OpenAPIDefinition注解,或者在application.yml/application.properties里配置扫描路径:
springdoc: packages-to-scan: com.yourpackage.controller
补充:为什么非响应式依赖能打开但显示不了Schema?
非响应式的springdoc-openapi-ui是为Servlet环境设计的,它无法正确解析WebFlux的Mono<T>/Flux<T>响应式包装类型,所以虽然能打开Swagger UI界面,但识别不了包装类里的实际业务对象Schema。
内容的提问来源于stack exchange,提问作者Gavin

