java - 带有 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>
解决方案
添加一个静态初始化器
SpringDocUtils.getConfig().addRestControllers(SvcApiController.class)
解决了这个问题。在这种情况下不需要 AddonController。
推荐阅读
- python - 如何确保 StratifiedShuffleSplit 保持不平衡的班级比例?
- python - pandas merge and group concat
- javascript - 如何重用 React 组件而无需更改其内部道具?
- python - 数据库上的 bigquery pandas df
- selenium - 无法使用 JavaScript Selenium Webdriver 找到 Web 元素
- python - tkinter box 的滚动配置
- sql - 如何在sql中比较2个转换日期
- websocket - 使用 IAM API 密钥的 IBM Watson 语音转文本 WebSocket 授权
- javascript - 当我打开模态两次时,添加此共享按钮不起作用
- html - 如何使 div 跟随右侧 div 的大小增长?