【问题标题】:WebFlux Swagger (Open API) integraton - Post Request sampleWebFlux Swagger (Open API) 集成 - 发布请求示例
【发布时间】:2020-07-21 08:15:08
【问题描述】:

我已经将 Swagger (OpenAPI) 与 Spring Webflux 集成在一起,如下所述:https://springdoc.org/#spring-weblfuxwebmvcfn-with-functional-endpoints using RouterOperation。集成工作正常,可在 /swagger-ui.html

访问

但是,对于 POST API,当我单击“试用”按钮时,我没有看到“请求”示例。我的 Post API 接受 Json 作为请求正文。

我该如何配置?可以通过 Annotations 以及 RouterOperation 或其他方式来完成吗?

编辑:下面是我的路由器类代码:

@Configuration
public class  MyRouter {

    @RouterOperations({
            @RouterOperation(path = "/data", beanClass = MyHandler.class, beanMethod = "getData"),
            @RouterOperation(path = "/allData", beanClass = MyHandler.class, beanMethod = "getAllData") })

    @Bean
    public RouterFunction<ServerResponse> route(MyHandler MyHandler) {

        return RouterFunctions
                .route(RequestPredicates.POST("/data").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), MyHandler::getData)
                .andRoute(RequestPredicates.GET("/allData").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), MyHandler::getAllData);
    }
}

添加 RouterOperations 注释后,我可以看到 swagger-ui 正确显示了 GET 和 POST API,但没有显示请求架构示例。

我还遇到了 yaml / json 文件来描述这一点。但是我没有找到在我的应用程序中放置这个文件的位置,以便 swagger-ui 使用它。

【问题讨论】:

  • 你能分享一些代码吗?我们无法确定是否缺少任何东西
  • @AbhinabaChakraborty 添加了有问题的代码

标签: java swagger-ui spring-webflux openapi springdoc-openapi-ui


【解决方案1】:

终于找到了

使用@Operation 和@Schema,可以定义需要的类作为请求正文中的输入。这将在 Swagger-ui 中显示为示例 json 结构。无需其他配置。

@RouterOperations({
            @RouterOperation(
                    path = "/data", beanClass = MyHandler.class,  beanMethod = "getData",
                    operation = @Operation(
                            operationId = "opGetData",
                            requestBody = @RequestBody(required = true, description = "Enter Request body as Json Object",
                                                content = @Content(
                                                        schema = @Schema(implementation = ApiRequestBody.class))))),
            @RouterOperation(path = "/allData", beanClass = MyHandler.class, beanMethod = "getAllData")})

@Bean
    public RouterFunction<ServerResponse> route(MyHandler myHandler) {

        return RouterFunctions
                .route(RequestPredicates.POST("/data").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), myHandler::getData)
                .andRoute(RequestPredicates.GET("/allData").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), myHandler::getAllData);
    }

【讨论】:

  • 我的一些路由器功能+端点是在应用程序启动时动态生成的,基于一些配置,有没有办法以编程方式创建@RouterOperations 来描述这些?