当前位置: 首页 > 知识库问答 >
问题:

使用SpringDoc webflux支持时无法显示Swagger/OpenApi文档

颜德馨
2023-03-14

我有一个小型Spring Boot微服务,它使用webflux将其endpoint公开为反应式。

当我运行应用程序从IntelliJ,Gradle或从cmd行与SpringDoc网络流量支持:
实现'org.springdoc: springdoc-openapi-webflent-ui: 1.4.4'
和我去http://localhost:8080/swagger-ui.html我得到一个500错误,日志显示:

java。lang.IllegalStateException:未找到接口组织的主构造函数或默认构造函数。springframework。http。服务器反应性。ServerHttpRequest]

根本原因是:

java。lang.NoSuchMethodException:org。springframework。http。服务器反应性。ServerHttpRequest。

如果我使用http://localhost:8080/swagger-用户界面/索引。html?configUrl=/v3/api docs/swagger config我得到的是404而不是500。

但是,如果我将依赖关系更改为非反应性SpringDoc模块:
实现组织。springdoc:springdoc openapi ui:1.4.4'

文档是可用的,它们只是不显示返回模式(我想这是预期的,因为响应被包装在Mono中)。

我已经研究过这个问题了但是没有帮助

我使用的是Spring Boot 2.3.3。在这个版本中,除了一个自动连接的服务类之外,我在控制器中没有什么“新奇”,endpoint只是用GetMapping注释并返回Mono

    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'

共有3个答案

晏晨朗
2023-03-14

对我来说,在kotlin spring boot项目中,问题在于endpoint返回通量,因此它抛出了一个优雅的异常:jackson BeanDescription。找不到findJsonValueAccessor,这可能导致结果不准确,请将jackson更新为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(""))
    }
}
茹建茗
2023-03-14

我有一个限制,我需要通过Servlet 3.1使用网络流量,即使它不是纯粹的反应性解决方案,但我可以通过Servlet重用一些Spring Security过滤器。所以,我不能像@brianbro建议的那样删除sping-boo-starter-web。

因此,我找到了一个解决方案,使springdoc openapi ui能够读取通量

    @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'
葛深
2023-03-14

您的项目正在使用spring boot starter web和spring boot starter webflux。

您只需要从依赖项中删除SpringBootStarterWeb。

 类似资料:
  • 当使用与SpringDoc-OpenAPI捆绑的CSRF头时,是否有一种方法可以自动地将CSRF头包含到从swagger ui发出的请求中? springfox(GitHub)中似乎实现了类似的解决方案,但我没有找到关于是否可以用SpringDoc-OpenAPI实现这一点的信息。

  • 例如: Swagger这样显示枚举: 我想要的是: API返回“显示名称”,然而,Swagger显示“枚举名称”,这经常导致混淆。有可能改变狂妄的价值观吗?

  • 我是个傻瓜。我试图用swagger 2.0 yaml记录一个API,其响应如下 正如您所见,“type”的类型是string,“id”是integer,“name”是string。但是什么类型的“地理”呢?我本来打算把“object”类型放在这里,但似乎object类型只是一个json对象。 据该网站称,OpenAPI只支持这些类型的字符串(包括日期和文件)数字整数布尔数组对象

  • 我使用和。我有一个带有方法的控制器,其中包含作为url参数的数组: 为什么会发生这种情况?为什么项目中没有显示示例数组?

  • 我正在用Swagger创建一个API文档。我直接尝试了openapi 3.0。不知何故,我无法得到我的请求机构工作的描述。 但这些描述不会出现: 我想得到像《大摇大摆2》那样的东西。下面是如何将相同的代码转换为Swagger 2

  • 我在一个带注释的对象中有几个枚举,如: 其中枚举定义为: 使用Openapi3,我可以生成一个swagger文档。我的问题是,和,翻译方式不同,如: 我希望< code>Enum2与< code>Enum1一样被记录,因此具有实际的枚举值。有什么方法可以强制这样做,或者解释为什么会这样?两个枚举基本上与示例中的相同。