首页 > 解决方案 > 带有 springdoc-openapi-ui 的 Swagger UI 不显示生成的“@Controller”类中的 API

问题描述

我有一个 Spring Boot 应用程序,其中 API 被指定为 OpenAPI 3.0.2 YAML 文档。我使用 openapi-generator-maven-plugin 从规范生成代码。当我打开 http://localhost:8080/swagger-ui.html 时,它显示:“规范中没有定义操作!”

在规范中,我有:

servers:
    - url: /books/api/v1

这导致在控制器类中:

@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2021-06-17T14:52:43.686820-07:00[America/Los_Angeles]")
@Controller
@RequestMapping("${openapi.axmPlatformKeyService.base-path:/books/api/v1}")
public class SvcApiController implements SvcApi {
    // ...
    // ...
}

如果我在 editor.swagger.io 中加载 openapi-definition.yaml,它会按预期显示定义。

如果我以这种方式创建另一个控制器:

@RestController
public class AddonController implements SvcApi {
    // ...
    // ...
}

然后 Swagger UI 显示 API,这基本上意味着如果生成的代码具有“@RestController”,它会正常工作。

由于生成的控制器带有 @Controller 注释,因此 Swagger UI 无法获取它。即使添加了这个额外的@RestController,Swagger UI 的 Try it out 功能也不会在它生成的 URL 中包含“/books/api/v1”。

净效应是使用此 AddonController,如果我在规范中有一个请求 /book/{id},则服务中有两个端点:

/books/api/v1/book/{id} /book/{id}

后者由 Swagger UI 调用。

这些是相关的依赖项:

    <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-ui</artifactId>
      <version>1.5.0</version>
    </dependency>

    <dependency>
      <groupId>io.swagger</groupId>
      <artifactId>swagger-annotations</artifactId>
      <version>1.6.2</version>
    </dependency>

标签: javaswaggeropenapi-generatorspringdoc-openapi-ui

解决方案


添加一个静态初始化器

SpringDocUtils.getConfig().addRestControllers(SvcApiController.class) 

解决了这个问题。在这种情况下不需要 AddonController。


推荐阅读