如何解决使用SpringDoc Webflux支持时无法显示Swagger / OpenApi文档
我有一个小型的Spring Boot微服务,它使用webflux将其端点公开为响应式的。
当我从IntelliJ,Gradle或具有SpringDoc webflux支持的cmd行运行应用程序时:implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.4'
而我去http://localhost:8080/swagger-ui.html
时遇到500错误,日志显示:
java.lang.IllegalStateException: No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest]
和根本原因:
java.lang.NoSuchMethodException: org.springframework.http.server.reactive.ServerHttpRequest.<init>()
如果我使用http://localhost:8080/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config
我得到的是404而不是500。
但是,如果我将依赖关系更改为非反应性SpringDoc模块:implementation 'org.springdoc:springdoc-openapi-ui:1.4.4'
文档可用,它们只是不显示返回模式(我想这是预期的,因为响应包含在Mono
中)。
I have looked at this question,but it didnt help
我正在使用Spring Boot 2.3.3.RELEASE,除了自动连接的服务类外,我在控制器中没有任何“花哨的东西”,该端点仅用GetMapping
注释并返回Mono<T>
。并且我包括以下依赖项:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.4'
解决方法
您的项目正在使用spring-boot-starter-web和spring-boot-starter-webflux。
您只需要从依赖项中删除spring-boot-starter-web。
,我有一个限制,我需要通过Servlet 3.1使用Webflux,尽管它不是纯粹的Reactive解决方案,但我可以在Servlet中重用一些Spring安全过滤器。
无论如何,我找到了一个解决方案,可以通过从springdoc-openapi-webflux-core中添加WebFluxSupportConverter来使springdoc-openapi-ui能够读取Flux和Mono。请参见以下代码。
@Bean
public OpenAPI customOpenAPI() {
ModelConverters.getInstance().addConverter(new WebFluxSupportConverter())
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("JWE",new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWE")))
.info(new Info()
.title("Marketplace API")
.version(apiVersion))
}
因此,您只需要包含库即可。
implementation 'org.springdoc:springdoc-openapi-ui:1.4.6'
implementation 'org.springdoc:springdoc-openapi-webflux-core:1.4.6'
,
对于我来说,在Kotlin春季启动项目中,问题在于端点返回Flux,因此抛出了异常的异常:jackson BeanDescription.findJsonValueAccessor not found,this could lead to inaccurate result,please update jackson to 2.9+
@Chayne P. S.的方法解决了我的问题:
class OpenApiConfigiguration {
@Bean
fun configOpenAPI(): OpenAPI? {
ModelConverters.getInstance().addConverter(WebFluxSupportConverter())
return OpenAPI()
.info(Info().title("API")
.description("WS restful API")
.version("v0.0.1")
.license(License().name("License of API")
.termsOfService("Terms of service"))
.externalDocs(ExternalDocumentation()
.description("Docs")
.url(""))
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。