在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
<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类
@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 .属性
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,我尝试创建如下所示的监听器配置类,但它无法工作
@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;
}
}将上述侦听器添加到主类
@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);
}
}上面的监听器配置不起作用,有人能在这里帮助我,并让我知道我在这里缺少什么吗?
发布于 2022-08-01 20:30:12
我一直看上去都一样。这些文件帮助我:
为了支持多个OpenAPI定义,需要定义一个GroupedOpenApi类型的bean。 对于以下组定义(基于包路径),OpenAPI描述URL为:/v3/api-docs/store
@Bean
public GroupedOpenApi storeOpenApi() {
String paths[] = {"/store/**"};
return GroupedOpenApi.builder().group("stores").pathsToMatch(paths)
.build();
}对于以下组定义(基于包名),OpenAPI描述URL为:/v3/api-docs/user
@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
@Bean
public GroupedOpenApi petOpenApi() {
String paths[] = {"/pet/**"};
return GroupedOpenApi.builder().group("pets").pathsToMatch(paths)
.build();
}对于以下组定义(基于包名和路径),OpenAPI描述URL为:/v3/api-docs/ Group
@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
https://stackoverflow.com/questions/72518942
复制相似问题