SpringMVC如何在生产环境禁用Swagger的方法

 更新时间:2018年02月23日 13:56:38   作者:若鱼1919  
本篇文章主要介绍了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也是一样。

应该还有更好的办法!

参考:https://www.jb51.net/article/135312.htm

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。太他妈的坑!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解析Java设计模式编程中命令模式的使用

    解析Java设计模式编程中命令模式的使用

    这篇文章主要介绍了Java设计模式编程中命令模式的使用,在一些处理请求响应的场合经常可以用到命令模式的编程思路,需要的朋友可以参考下
    2016-02-02
  • Java中的getClass()以及getName()方法使用

    Java中的getClass()以及getName()方法使用

    这篇文章主要介绍了Java中的getClass()以及getName()方法使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • pageHelper一对多分页解决方案示例

    pageHelper一对多分页解决方案示例

    这篇文章主要为大家介绍了pageHelper一对多分页解决方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java局部变量线程安全原理分析

    Java局部变量线程安全原理分析

    这篇文章主要介绍了Java局部变量线程安全原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot整合OpenApi的实践

    SpringBoot整合OpenApi的实践

    本文主要介绍了SpringBoot整合OpenApi,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • IDEA 工程里 new不出来Vue文件的图文解决方案

    IDEA 工程里 new不出来Vue文件的图文解决方案

    这篇文章主要介绍了IDEA 工程里 new不出来Vue文件的解决方案,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java软引用在浏览器使用实例讲解

    java软引用在浏览器使用实例讲解

    在本篇文章里小编给大家整理的是一篇关于java软引用在浏览器使用实例讲解内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • Java如何实现Unicode和中文相互转换

    Java如何实现Unicode和中文相互转换

    这篇文章主要介绍了Java如何实现Unicode和中文相互转换问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Springboot中yml对于list列表配置方式详解

    Springboot中yml对于list列表配置方式详解

    这篇文章主要介绍了Springboot中yml对于list列表配置方式详解,使用@ConfigurationProperties读取yml配置文件过程中会遇到读取yml文件中列表,Config里面使用List集合接收,方法比较简单,需要的朋友可以参考下
    2023-11-11
  • JAVA泛型的继承和实现、擦除原理解析

    JAVA泛型的继承和实现、擦除原理解析

    这篇文章主要介绍了JAVA泛型的继承和实现、擦除原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论