WebFlux Swagger(打开 API)集成器 - Post 请求示例

WebFlux Swagger (Open API) integraton - Post Request sample

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

访问

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

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

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

@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 使用它。

终于找到了

使用@Operation 和@Schema,可以将required 的class 定义为请求正文中的输入。这将在 Swagger-ui 中显示为示例 json 结构。没有其他配置 required.

@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);
    }