您好,登錄后才能下訂單哦!
小編給大家分享一下SpringMVC怎么在生產(chǎn)環(huán)境禁用Swagger,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)。總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來(lái)更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來(lái)始終保持同步。
Swagger 讓部署管理和使用功能強(qiáng)大的API從未如此簡(jiǎn)單。好吧,以上是官方的說(shuō)法,我直接復(fù)制的,在我看來(lái)swagger就是一個(gè)接口文檔管理器,以前我們寫接口一般都是world編寫,但是有一個(gè)問題就是測(cè)試的時(shí)候需要依賴第三方工具,GET的接口還好,直接瀏覽器打開,POST的只能依賴另外的工具了,而Swagger呢,可以直接通過代碼中的注解生成接口文檔(JavaEE),一般人都用這種方式,而且直接集成在項(xiàng)目中,方便成員查看,同時(shí)還能直接測(cè)試,另外Swagger的界面也不錯(cuò),也許這就是我選擇用Swagger的原因吧,直接官方說(shuō)的RESTful 風(fēng)格那個(gè)不用管,不是RESTful 風(fēng)格的接口也能用,當(dāng)然Swagger還有一種方式就是手動(dòng)寫接口說(shuō)明了,這樣的好處就是代碼只有代碼,因?yàn)橐坏┐a中添加了Swagger的接口注解后,代碼量還是增加了不少,當(dāng)然壞處就是你改完了代碼,還要去改接口文檔
SpringMVC集成springfox-swagger2和springfox-swagger-ui很簡(jiǎn)單,只需要兩步:
(1)pom中添加依賴
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox-swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox-swagger.version}</version> </dependency>
(2)添加Swagger的配置類:
@Configuration @EnableSwagger2 @EnableWebMvc @ComponentScan("com.XXX.controller") public class SwaggerConfig{ }
然后就可以通過http://localhost/swagger-ui.html看到項(xiàng)目中所有的接口信息了,通過http://localhost/v2/api-docs就能看到j(luò)son數(shù)據(jù)。
但是,如何在生產(chǎn)環(huán)境禁用這些api文檔呢?試了很多種方式,最終找到一個(gè)簡(jiǎn)單實(shí)用的辦法:
@Configuration @EnableSwagger2 @EnableWebMvc @ComponentScan("com.XXX.controller") public class SwaggerConfig{ @Autowired ConfigService configService; @Bean public Docket customDocket() { if(configService.getServerEnv() == ServerEnvEnum.ONLINE) { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfoOnline()) .select() .paths(PathSelectors.none())//如果是線上環(huán)境,添加路徑過濾,設(shè)置為全部都不符合 .build(); }else { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()); } } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("XXX系統(tǒng)") .description("XXX系統(tǒng)接口") .license("") .licenseUrl("") .termsOfServiceUrl("") .version("1.0.0") .contact(new Contact("","", "")) .build(); } private ApiInfo apiInfoOnline() { return new ApiInfoBuilder() .title("") .description("") .license("") .licenseUrl("") .termsOfServiceUrl("") .version("") .contact(new Contact("","", "")) .build(); } }
現(xiàn)在http://localhost/swagger-ui.html這個(gè)頁(yè)面雖然還能訪問,那是卻看不到任何內(nèi)容了,包括http://localhost/v2/api-docs也是一樣。
應(yīng)該還有更好的辦法!
參考:https://www.jb51.net/article/135312.htm
swagger必須要跟springmvc在同一個(gè)context才行,springmvc只是spring的一個(gè)子context。如果swagger讓spring的context加載,那么swagger的那些url用springmvc的攔截器是攔截不到的!
所以,兩種解決辦法:
如果是使用注解的方式:
(1)spring-mvc的配置:
<!-- 使用Annotation自動(dòng)注冊(cè)Bean,只掃描@Controller --> <context:component-scan base-package="com.inspur.eyun.yunbx" use-default-filters="false"><!-- base-package 如果多個(gè),用“,”分隔 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="assignable" expression="com.inspur.eyun.yunbx.swagger.SwaggerConfig"/> </context:component-scan>
注意要把swagger的配置加進(jìn)來(lái),同時(shí):
(2)spring的配置:
<!-- 包掃描、注解相關(guān) --> <context:component-scan base-package="com.inspur.eyun.yunbx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:exclude-filter type="assignable" expression="com.inspur.eyun.yunbx.swagger.SwaggerConfig"/> </context:component-scan>
注意把swagger排除掉
(3)Swagger的配置:
@Configuration @EnableSwagger2 @EnableWebMvc @ComponentScan("com.inspur.eyun.yunbx.controller") public class SwaggerConfig{ }
注意@Configuration注解。
當(dāng)然更推薦的辦法是使用xml配置的方式,因?yàn)檫@樣可以不用引入swagger的依賴包:
(1)spring-mvc的配置:
<!-- 使用Annotation自動(dòng)注冊(cè)Bean,只掃描@Controller --> <context:component-scan base-package="com.inspur.eyun.yunbx" use-default-filters="false"><!-- base-package 如果多個(gè),用“,”分隔 --> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <import resource="classpath:spring-mvc-swagger.xml" />
spring-mvc-swagger.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <description>SpringMVC Swagger Configuration</description> <!-- swagger配置,生產(chǎn)環(huán)境置空 --> <bean class="com.inspur.eyun.yunbx.swagger.SwaggerConfig" /> </beans>
注意:我們這里把swagger單獨(dú)放到一個(gè)配置文件中,如果是線上環(huán)境,則文件內(nèi)容為空,如果是線下測(cè)試環(huán)境,則配置上Swagger。
(2)spring的配置:
<!-- 包掃描、注解相關(guān) --> <context:component-scan base-package="com.inspur.eyun.yunbx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
(3)Swagger的配置:
@EnableSwagger2 @EnableWebMvc public class SwaggerConfig{ @Bean public Docket customDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.inspur.eyun.yunbx.controller")) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("XXX平臺(tái)") .description("XXX平臺(tái)接口") .license("") .licenseUrl("") .termsOfServiceUrl("") .version("1.0.0") .contact(new Contact("","", "")) .build(); } }
注意:這里我們?nèi)サ袅薂Configuration,同時(shí),修改我們的pom,配置多profile打包:
pom.xml:
<!-- Swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox-swagger.version}</version> <scope>${swagger.scope}</scope> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <scope>${swagger.scope}</scope> <version>${springfox-swagger-ui.version}</version> </dependency>
注意:這里的依賴的scope是動(dòng)態(tài)設(shè)置的,如果是線上環(huán)境,我們把scope設(shè)置成provided就可以。
<profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> <swagger.scope>compile</swagger.scope> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <profiles.active>test</profiles.active> <swagger.scope>compile</swagger.scope> </properties> </profile> <profile> <id>online</id> <properties> <profiles.active>online</profiles.active> <swagger.scope>provided</swagger.scope> </properties> </profile> </profiles>
通過不同的profile給swagger的依賴設(shè)置不同的scope!
注意:springfox-swagger.version=2.7.0有bug,可以使用低版本2.6.1。太他媽的坑!
看完了這篇文章,相信你對(duì)“SpringMVC怎么在生產(chǎn)環(huán)境禁用Swagger”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。