1

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

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

我该如何配置?这可以通过注释以及 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 使用它。

4

1 回答 1

5

终于找到了

使用@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);
    }
于 2020-07-23T06:21:05.820 回答