SpringMVC如何在生产环境禁用Swagger的方法
swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 restful 风格的 web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许api来始终保持同步。
swagger 让部署管理和使用功能强大的api从未如此简单。好吧,以上是官方的说法,我直接复制的,在我看来swagger就是一个接口文档管理器,以前我们写接口一般都是world编写,但是有一个问题就是测试的时候需要依赖第三方工具,get的接口还好,直接浏览器打开,post的只能依赖另外的工具了,而swagger呢,可以直接通过代码中的注解生成接口文档(javaee),一般人都用这种方式,而且直接集成在项目中,方便成员查看,同时还能直接测试,另外swagger的界面也不错,也许这就是我选择用swagger的原因吧,直接官方说的restful 风格那个不用管,不是restful 风格的接口也能用,当然swagger还有一种方式就是手动写接口说明了,这样的好处就是代码只有代码,因为一旦代码中添加了swagger的接口注解后,代码量还是增加了不少,当然坏处就是你改完了代码,还要去改接口文档
springmvc集成springfox-swagger2和springfox-swagger-ui很简单,只需要两步:
(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看到项目中所有的接口信息了,通过http://localhost/v2/api-docs就能看到json数据。
但是,如何在生产环境禁用这些api文档呢?试了很多种方式,最终找到一个简单实用的办法:
@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())//如果是线上环境,添加路径过滤,设置为全部都不符合 .build(); }else { return new docket(documentationtype.swagger_2) .apiinfo(apiinfo()); } } private apiinfo apiinfo() { return new apiinfobuilder() .title("xxx系统") .description("xxx系统接口") .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(); } }
现在http://localhost/swagger-ui.html这个页面虽然还能访问,那是却看不到任何内容了,包括http://localhost/v2/api-docs也是一样。
应该还有更好的办法!
参考:
swagger必须要跟springmvc在同一个context才行,springmvc只是spring的一个子context。如果swagger让spring的context加载,那么swagger的那些url用springmvc的拦截器是拦截不到的!
所以,两种解决办法:
如果是使用注解的方式:
(1)spring-mvc的配置:
<!-- 使用annotation自动注册bean,只扫描@controller --> <context:component-scan base-package="com.inspur.eyun.yunbx" use-default-filters="false"><!-- base-package 如果多个,用“,”分隔 --> <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的配置加进来,同时:
(2)spring的配置:
<!-- 包扫描、注解相关 --> <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注解。
当然更推荐的办法是使用xml配置的方式,因为这样可以不用引入swagger的依赖包:
(1)spring-mvc的配置:
<!-- 使用annotation自动注册bean,只扫描@controller --> <context:component-scan base-package="com.inspur.eyun.yunbx" use-default-filters="false"><!-- base-package 如果多个,用“,”分隔 --> <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配置,生产环境置空 --> <bean class="com.inspur.eyun.yunbx.swagger.swaggerconfig" /> </beans>
注意:我们这里把swagger单独放到一个配置文件中,如果是线上环境,则文件内容为空,如果是线下测试环境,则配置上swagger。
(2)spring的配置:
<!-- 包扫描、注解相关 --> <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平台") .description("xxx平台接口") .license("") .licenseurl("") .termsofserviceurl("") .version("1.0.0") .contact(new contact("","", "")) .build(); } }
注意:这里我们去掉了@configuration,同时,修改我们的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是动态设置的,如果是线上环境,我们把scope设置成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的依赖设置不同的scope!
注意:springfox-swagger.version=2.7.0有bug,可以使用低版本2.6.1。太他妈的坑!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。