首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenApi3 Springboot应用程序中为Swagger提供自定义上下文路径

如何在OpenApi3 Springboot应用程序中为Swagger提供自定义上下文路径
EN

Stack Overflow用户
提问于 2022-06-06 14:09:17
回答 1查看 1.8K关注 0票数 0

在Springboot项目中,我将从springfox迁移到OpenApi3,因为我们需要用2.7.0版本升级到最新的springboot

我需要为不同的环境配置自定义contextPath,如下所示

dev - https://qa.swagger.com/dev/api/myApp/swagger-ui/index.html

qa - https://qa.swagger.com/api/myApp/swagger-ui/index.html

uat - https://uat.swagger.com/api/myApp/swagger-ui/index.html#/

// pom.xml

代码语言:javascript
复制
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

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

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-webmvc-core</artifactId>
            <version>1.6.8</version>
        </dependency>

// SwaggerConfig类

代码语言:javascript
复制
@Configuration
@Profile({ "local", "dev", "qat", "uat" })
public class SwaggerConfig {

@Bean
    public OpenAPI openAPI() {

        return new OpenAPI().info(info());
    }
    
    private Info info() {
         return new Info()
        .title(title)
        .version(version)
        .license(new License().name(licenseName).url(licenseUrl));
        }
}

//application.properties .属性

代码语言:javascript
复制
spring.application.name=myApp
server.servlet.context-path=/api/${spring.application.name}

有了上面的配置,我可以使用url下面的url运行swagger,并从控制器apis http://localhost:8082/api/myApp/swagger-ui/index.html#/获得所有所需的响应。

为了为其他环境配置Swagger url,我尝试创建如下所示的监听器配置类,但它无法工作

代码语言:javascript
复制
@Component
public class SwaggerListener implements ApplicationListener<ApplicationPreparedEvent> {

    final ApplicationPreparedEvent event = null;

    @Override
    public void onApplicationEvent(final ApplicationPreparedEvent event) {

        ConfigurableEnvironment environment = event.getApplicationContext().getEnvironment();

        Properties properties = new Properties();
        properties.put("springdoc.swagger-ui.path", swaggerPath(event));
        environment.getPropertySources().addFirst(new PropertiesPropertySource("programmatically", properties));

    }

    private String swaggerPath(final ApplicationPreparedEvent event) {
        String basePath = null;
        String swagger = "swagger-ui/index.html";
        ConfigurableEnvironment environment = event.getApplicationContext().getEnvironment();
        String[] profilesList = environment.getActiveProfiles();
        List<String> profiles = Arrays.asList(profilesList);
        String contextPath = environment.getProperty("server.servlet.context-path");
        if (profiles != null && (profiles.contains("local"))) {
            basePath = swagger;
        } else if (profiles != null && profiles.contains("dev")) {
            basePath = "/dev/api/myApp/" + swagger;
        } else if (profiles != null && (profiles.contains("qat") || profiles.contains("uat"))) {
            basePath = "/api/myApp/";

        }
        return basePath;
    }

}

将上述侦听器添加到主类

代码语言:javascript
复制
@SpringBootApplication(scanBasePackages = { "com.myApp.controller" })
@OpenAPIDefinition
public class myApi {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(myApi.class);
        springApplication.addListeners(new SwaggerListener());      
        springApplication.run(args);

    }

}

上面的监听器配置不起作用,有人能在这里帮助我,并让我知道我在这里缺少什么吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-01 20:30:12

我一直看上去都一样。这些文件帮助我:

为了支持多个OpenAPI定义,需要定义一个GroupedOpenApi类型的bean。 对于以下组定义(基于包路径),OpenAPI描述URL为:/v3/api-docs/store

代码语言:javascript
复制
@Bean
public GroupedOpenApi storeOpenApi() {
   String paths[] = {"/store/**"};
   return GroupedOpenApi.builder().group("stores").pathsToMatch(paths)
         .build();
}

对于以下组定义(基于包名),OpenAPI描述URL为:/v3/api-docs/user

代码语言:javascript
复制
@Bean
public GroupedOpenApi userOpenApi() {
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user"};
   return GroupedOpenApi.builder().group("users").packagesToScan(packagesToscan)
         .build();
}

对于以下组定义(基于路径),OpenAPI描述URL为:/v3/api-docs/OpenAPI

代码语言:javascript
复制
@Bean
public GroupedOpenApi petOpenApi() {
   String paths[] = {"/pet/**"};
   return GroupedOpenApi.builder().group("pets").pathsToMatch(paths)
         .build();
}

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

代码语言:javascript
复制
@Bean
public GroupedOpenApi groupOpenApi() {
   String paths[] = {"/v1/**"};
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user", "test.org.springdoc.api.app68.api.store"};
   return GroupedOpenApi.builder().group("groups").pathsToMatch(paths).packagesToScan(packagesToscan)
         .build();
}

来源:SPRINDOC

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72518942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档