使用 SpringDoc webflux 支持时无法显示 Swagger/OpenApi 文档
Unable to display Swagger/OpenApi docs when using SpringDoc webflux support
我有一个小型 Spring 引导微服务,它使用 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'
文档可用,它们只是不显示 return 架构(我想这是预期的,因为响应包含在 Mono
中)。
I have looked at this question, but it didnt help
我正在使用 Spring Boot 2.3.3.RELEASE,除了自动装配服务 class,我在控制器中没有任何“花哨”的东西 class,端点只是用 GetMapping
和 returns 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 解决方案,但我可以重用一些 Spring 安全过滤器和 Servlet.So,我不能只删除spring-boot-starter-web 正如@brianbro 建议的那样。
因此,我找到了一个解决方案,通过添加来自 springdoc-openapi-webflux-core 的 WebFluxSupportConverter 作为额外的转换器,使 springdoc-openapi-ui 能够读取 Flux & Mono。请参阅 Groovy.
中的以下代码
@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 spring 启动项目中,问题在于端点返回 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(""))
}
}
我有一个小型 Spring 引导微服务,它使用 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'
文档可用,它们只是不显示 return 架构(我想这是预期的,因为响应包含在 Mono
中)。
I have looked at this question, but it didnt help
我正在使用 Spring Boot 2.3.3.RELEASE,除了自动装配服务 class,我在控制器中没有任何“花哨”的东西 class,端点只是用 GetMapping
和 returns 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 解决方案,但我可以重用一些 Spring 安全过滤器和 Servlet.So,我不能只删除spring-boot-starter-web 正如@brianbro 建议的那样。
因此,我找到了一个解决方案,通过添加来自 springdoc-openapi-webflux-core 的 WebFluxSupportConverter 作为额外的转换器,使 springdoc-openapi-ui 能够读取 Flux & Mono。请参阅 Groovy.
中的以下代码 @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 spring 启动项目中,问题在于端点返回 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(""))
}
}