如何在OpenApi3 Springboot应用程序中为Swagger URL设置自定义上下文路径

dzhpxtsq  于 2022-11-06  发布在  Spring
关注(0)|答案(1)|浏览(371)

我在Springboot项目中从springfox迁移到OpenApi 3,因为我们需要升级到最新的Springboot版本2.7.0
我需要为不同的环境配置自定义contextPath,如下所示
开发人员-https://qa.swagger.com/dev/api/myApp/swagger-ui/index.html
qa -https://qa.swagger.com/api/myApp/swagger-ui/index.html
网站https://uat.swagger.com/api/myApp/swagger-ui/index.html#/
//pom.xml文件

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.7.0</version>
  5. <relativePath /> <!-- lookup parent from repository -->
  6. </parent>
  7. <dependency>
  8. <groupId>org.springdoc</groupId>
  9. <artifactId>springdoc-openapi-ui</artifactId>
  10. <version>1.6.8</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springdoc</groupId>
  14. <artifactId>springdoc-openapi-webmvc-core</artifactId>
  15. <version>1.6.8</version>
  16. </dependency>

// SwaggerConfig类别

  1. @Configuration
  2. @Profile({ "local", "dev", "qat", "uat" })
  3. public class SwaggerConfig {
  4. @Bean
  5. public OpenAPI openAPI() {
  6. return new OpenAPI().info(info());
  7. }
  8. private Info info() {
  9. return new Info()
  10. .title(title)
  11. .version(version)
  12. .license(new License().name(licenseName).url(licenseUrl));
  13. }
  14. }

//application.properties

  1. spring.application.name=myApp
  2. server.servlet.context-path=/api/${spring.application.name}

有了上面的配置,我就可以使用下面的url运行swagger,并从控制器API获取所有需要的响应http://localhost:8082/api/myApp/swagger-ui/index. html #/
为了在其他环境中配置Swaggerurl,我尝试创建一个如下的侦听器配置类,但没有成功

  1. @Component
  2. public class SwaggerListener implements ApplicationListener<ApplicationPreparedEvent> {
  3. final ApplicationPreparedEvent event = null;
  4. @Override
  5. public void onApplicationEvent(final ApplicationPreparedEvent event) {
  6. ConfigurableEnvironment environment = event.getApplicationContext().getEnvironment();
  7. Properties properties = new Properties();
  8. properties.put("springdoc.swagger-ui.path", swaggerPath(event));
  9. environment.getPropertySources().addFirst(new PropertiesPropertySource("programmatically", properties));
  10. }
  11. private String swaggerPath(final ApplicationPreparedEvent event) {
  12. String basePath = null;
  13. String swagger = "swagger-ui/index.html";
  14. ConfigurableEnvironment environment = event.getApplicationContext().getEnvironment();
  15. String[] profilesList = environment.getActiveProfiles();
  16. List<String> profiles = Arrays.asList(profilesList);
  17. String contextPath = environment.getProperty("server.servlet.context-path");
  18. if (profiles != null && (profiles.contains("local"))) {
  19. basePath = swagger;
  20. } else if (profiles != null && profiles.contains("dev")) {
  21. basePath = "/dev/api/myApp/" + swagger;
  22. } else if (profiles != null && (profiles.contains("qat") || profiles.contains("uat"))) {
  23. basePath = "/api/myApp/";
  24. }
  25. return basePath;
  26. }
  27. }

正在将上述侦听器添加到主类

  1. @SpringBootApplication(scanBasePackages = { "com.myApp.controller" })
  2. @OpenAPIDefinition
  3. public class myApi {
  4. public static void main(String[] args) {
  5. SpringApplication springApplication = new SpringApplication(myApi.class);
  6. springApplication.addListeners(new SwaggerListener());
  7. springApplication.run(args);
  8. }
  9. }

上面的侦听器配置不起作用,有人能帮我吗?让我知道我在这里错过了什么?

uz75evzq

uz75evzq1#

我一直看起来一样。此文档帮助我:
要启用对多个OpenAPI定义的支持,需要定义GroupedOpenApi类型的Bean。
对于以下组定义(基于软件包路径),OpenAPI描述URL将为:/v3/api-docs/存储

  1. @Bean
  2. public GroupedOpenApi storeOpenApi() {
  3. String paths[] = {"/store/**"};
  4. return GroupedOpenApi.builder().group("stores").pathsToMatch(paths)
  5. .build();
  6. }

对于以下组定义(基于软件包名称),OpenAPI描述URL将为:/v3/api-docs/用户

  1. @Bean
  2. public GroupedOpenApi userOpenApi() {
  3. String packagesToscan[] = {"test.org.springdoc.api.app68.api.user"};
  4. return GroupedOpenApi.builder().group("users").packagesToScan(packagesToscan)
  5. .build();
  6. }

对于以下组定义(基于路径),OpenAPI描述URL将为:/v3/api文档/宠物

  1. @Bean
  2. public GroupedOpenApi petOpenApi() {
  3. String paths[] = {"/pet/**"};
  4. return GroupedOpenApi.builder().group("pets").pathsToMatch(paths)
  5. .build();
  6. }

对于以下组定义(基于软件包名称和路径),OpenAPI描述URL将为:/v3/api-docs/组

  1. @Bean
  2. public GroupedOpenApi groupOpenApi() {
  3. String paths[] = {"/v1/**"};
  4. String packagesToscan[] = {"test.org.springdoc.api.app68.api.user", "test.org.springdoc.api.app68.api.store"};
  5. return GroupedOpenApi.builder().group("groups").pathsToMatch(paths).packagesToScan(packagesToscan)
  6. .build();
  7. }

来源:SPRINDOC

展开查看全部

相关问题