我们已经将一个复杂的maven应用程序(几个模块和许多依赖项)从Spring Boot 2/javax迁移到Spring Boot 3/jakarta。因此,我们已经从使用SpringDoc 1迁移到SpringDoc 2。
具体来说,最终应用程序中包含的相关软件包的版本如下:
spring-boot-starter-web:3.0.4
springdoc-openapi-starter-webmvc-ui:2.1.0
springdoc-openapi-starter-common:2.1.0
springdoc-openapi-starter-webmvc-api:2.1.0
swagger-ui:4.18.2
swagger-core-jakarta:2.2.9
swagger-annotations-jakarta:2.2.9
swagger-models-jakarta:2.2.9
我们主要使用java注释来定义openapi/swagger。
我们为openapi和swagger文档使用自定义端点:
# openapi documentation plus swagger
springdoc:
# openapi provides documentation in json format. Having it enabled is a requiment of swagger-ui
api-docs:
# URI. defaultValue=/v3/api-docs
path: /api-docs
# Enable / Disable springdoc-openapi enpoint
enabled: true
# swagger allows exercesicing the API from a browser
swagger-ui:
# URI. defaultValue=swagger-ui.html
path: /docs
# Enable / Disable the swagger-ui endpoint
enabled: true
# Sort endpoints alphabetically
operationsSorter: method
#Sort tags alphabetically
tagsSorter: method
(与迁移前相同)
当我们不使用GroupedOpenApi
,但当我们添加:
private GroupedOpenApi getGroupedOpenApi(String category) {
GroupedOpenApi group = GroupedOpenApi.builder().group(category).pathsToMatch(String.format("/%s/**",category)).build();
log.info("Creating documentation group {} : {}", category, group.toString());
return group;
}
@Bean public GroupedOpenApi c1OpenApi() { return getGroupedOpenApi("c1"); }
@Bean public GroupedOpenApi c2OpenApi() { return getGroupedOpenApi("c2"); }
@Bean public GroupedOpenApi c3OpenApi() { return getGroupedOpenApi("c3"); }
@Bean public GroupedOpenApi c4OpenApi() { return getGroupedOpenApi("c4"); }
到我们的OpenApi配置类,swagger端点显示:😱 Could not render nn, see the console.
和No API definition provided.
,但yaml的终点确实有正确的值在/api-docs/c1
/api-docs/c2
等
要明确的是,在迁移之前,用相同代码指定的分组api在swagger上工作得很好。
有什么问题吗?应用程序本身运行良好。谢谢你。
我自己也遇到过类似的问题,我不完全确定这是一个bug还是一个已知的限制。
似乎正在发生的事情是,当您在配置类(这也是一个bean)中创建GroupedOpenApi
bean时,它在配置阶段(在SpringDocConfiguration
)非常早地被调用。此时,许多其他bean创建过程(例如解析属性文件中的值)尚未执行。这意味着很多配置在这个阶段还没有解决。
当创建过程最终开始执行时,包含GroupedOpenApi
bean的配置bean已经被Spring标记为已经加载。因此,解析值的过程会跳过它。这使得bean在应用程序的整个生命周期中处于非常初始的阶段。
我设法通过将GroupedOpenApi
bean放在一个完全独立的类中而没有任何其他配置来解决这个问题,确保它不依赖于其他任何东西。但是,此解决方案可能不是普遍适用的,需要根据具体情况进行调整。