原文: https://xw.qq.com/cmsid/20200402A009S500
那么,針對該問題,本篇文章為大家提供三種解決方案。選擇最適合你的即可。 方案一:根據條件判斷的方式 此種方式最常見,在配置文件中配置一個標識,比如: swagger: show : false 在不需要的環境時,直接設置為false即可。比如dev和test環境的配置文件中設置為true,prod環境中的配置文件設置為false。這些設置與數據庫等環境的配置類似。 swagger: show : true 完成配置文件的配置之后,還要進行使用,此時在初始化Swagger2的配置類中進行注入改屬性值。 @Configuration @EnableSwagger2 public class SwaggerConfig { @Value("${swagger.show}") private boolean swaggerShow; } 這樣配置類就擁有了該屬性的值,然后在構造Docket時調用Docket的enable方法,將該值傳遞進去。 @Configuration@EnableSwagger2@Profile({"test"})public class SwaggerConfig { @Value("${swagger.show}") private boolean swaggerShow; @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) // 此處設置是否開啟 .enable(swaggerShow) .apiInfo(apiInfo()); // 省略了其他配置 }} 至此便跟隨不同的環境的不同配置,決定是否開啟Swagger2了。 方案二 基於Profile進行配置。我們知道@Profile可以指定組件在哪個環境的情況下才能被注冊到容器中。默認不指定,任何環境下都能注冊這個組件。 我們可以通過@Profile注解來決定是否在指定的環境中進行注入。 @Configuration @EnableSwagger2 @Profile({"dev","test"}) public class SwaggerConfig { // 省略配置代碼 } 上述配置中,只有在dev和test環境下才會進行組件的實例化和注入。 方案三 該方式還是在第一種方式上進行延伸拓展。還需要配置對應的標識在配置文件中。然后在我們之前講的WebMvcConfigurer或WebSecurityConfigurerAdapter的實現類中進行指定URL的攔截配置。 比如: @Configuration@ComponentScan(value = "org.xx.interceptor")class WebMvcConfig extends WebMvcConfigurerAdapter { @Value("${swagger.show}") private boolean swaggerShow; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { if (this.swaggerShow) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }} 或者根據標識攔截swagger2的Docket掃描的路徑,根據不同的環境將Docker調用的paths方法替換成不同的參數: .paths(PathSelectors.any()) 或 .paths(PathSelectors.none()) 如果是線上環境,添加路徑過濾,設置為全部都不符合。 小結 針對自己所使用的項目情況,可選擇不同的方式來進行操作。但個人建議,優先選擇第二種,因為此時利用Spring Boot的特性,根本不用去初始化組件,更加省事和安全。其次,可選擇第一種方案。
