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也是一样。

应该还有更好的办法!

参考:http://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。太他妈的坑!

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

您可能感兴趣的文章:

  • SpringMVC 中配置 Swagger 插件的教程(分享)
  • Spring MVC利用Swagger2如何构建动态RESTful API详解
  • SpringMVC和Swagger整合方法
  • Spring MVC集成springfox-swagger2构建restful API的方法详解
  • SpringMVC集成Swagger实例代码
(0)

相关推荐

  • SpringMVC集成Swagger实例代码

    此前写过一个关于SpringBoot集成Swagger的帖子,因为有的项目是SpringMVC的,所以也简单整理了一下,基本一致. 本例使用的是spring 4.1.6版本 1.添加POM依赖 <!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <vers

  • SpringMVC 中配置 Swagger 插件的教程(分享)

    一.简介 Swagger的目标是为REST API定义一个与语言无关的标准接口,允许用户发现和理解计算机服务的功能,而无需访问源代码.当通过Swagger正确定义时,用户可以用最少量的实现逻辑理解远程服务并与之交互.类似于低级编程所做的接口. 二.实现步骤 1.添加 Maven 依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifact

  • Spring MVC利用Swagger2如何构建动态RESTful API详解

    前言 本文主要给大家介绍了关于Spring MVC用Swagger2构建动态RESTful API的相关内容,当多终端(WEB/移动端)需要公用业务逻辑时,一般会构建 RESTful 风格的服务提供给多终端使用. 为了减少与对应终端开发团队频繁沟通成本,刚开始我们会创建一份 RESTful API 文档来记录所有接口细节. 但随着项目推进,这样做所暴露出来的问题也越来越严重. a. 接口众多,细节复杂(需考虑不同的 HTTP 请求类型.HTTP 头部信息.HTTP 请求内容..),高质量地创建这

  • SpringMVC和Swagger整合方法

    描述 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法.参数和模型紧密集成到服务器端的代码,允许 API 来始终保持同步.Swagger 让部署管理和使用功能强大的 API 从未如此简单. 配置 1.引入相关jar包: <dependency> <groupId>io.springfox</groupId> <artifactId>

  • Spring MVC集成springfox-swagger2构建restful API的方法详解

    前言 在集成springfox-swagger2之前,我也尝试着集成了swagger-springmvc,方式差不多,但是swagger-springmvc相对麻烦一点,因为要把它的静态文件copy到自己的项目中.所以还是用新版本的. 至于两者有什么不同,为什么进行版本变更请参见官方说明文档 方法如下 这里先写下需要的pom.xml配置(我引用的2.4.0,相对稳定) <dependency> <groupId>io.springfox</groupId> <ar

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

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步. Swagger 让部署管理和使用功能强大的API从未如此简单.好吧,以上是官方的说法,我直接复制的,在我看来swagger就是一个接口文档管理器,以前我们写接口一般都是world编写,但是有一个问题就是测试的时候需要依赖第三方工具,GET的接口还好,直接浏览

  • vue中控制mock在开发环境使用,在生产环境禁用方式

    目录 vue控制mock在开发环境使用,在生产环境禁用 说下原因 解决方案 vue中使用mock(常用方式) 前期准备 安装axios和mock.js插件 在main.js中引入 编写mock.js 调用 成功 vue控制mock在开发环境使用,在生产环境禁用 说下原因 mock拦截所有的axios请求,根据请求,做出相应的响应.平时前后端分离开发,我们使用mock获得相应的数据,但当和后端联调的时候,不禁用mock,就无法获得后端数据. 解决方案 第一步.我们设置mock在开发developm

  • python生产环境禁用assert断言的方法

    目录 1. 背景 2.解决方案 2.1 禁用assert的策略 2.2 禁用的原理 3. 实施禁用策略 3.1 启动命令行的参数中,添加-O 3.2 设置PYTHONOPTIMIZE环境变量 4 使用断言的坑 1. 背景 在潜意识中, assert 是应用在unittest或pytest环境中, 不能应用到业务代码中, 因为断言会导致运行中断,对业务有损,并且消耗内存, 影响性能. 但不可否认, 使用断言非常方便调试代码 通过研读assert的文档, 发现断言是可以被关闭的,特此记录下 详细的介

  • spring-boot 禁用swagger的方法

    在使用spring-boot开发的时候,我们很多时候会使用swagger作为api文档输出.可以在UI界面上看到api的路径,参数等等. 当然,作为开发环境是很方便的,但是上生产环境的时候,我们需要把swagger禁掉.怎么通过配置文件的方法来禁用swagger呢? 代码如下: import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cont

  • SpringBoot在生产快速禁用Swagger2的方法步骤

    你还在生产节点开放Swagger吗,赶紧停止这种暴露接口的行为吧. 学习目标 快速学会使用注解关闭Swagger2,避免接口重复暴露. 使用教程 禁用方法1:使用注解@Profile({"dev","test"}) 表示在开发或测试环境开启,而在生产关闭.(推荐使用) 禁用方法2:使用注解@ConditionalOnProperty(name = "swagger.enable", havingValue = "true") 

  • 详解SpringBoot禁用Swagger的三种方式

    目录 摘要 方法 禁用方法1: 禁用方法2: 禁用方法3: 摘要 在生产环境下,我们需要关闭swagger配置,避免暴露接口的这种危险行为. 方法 禁用方法1: 使用注解 @Value() 推荐使用 package com.dc.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Be

  • 使用pm2部署node生产环境的方法步骤

    一.PM2是什么 是可以用于生产环境的Nodejs的进程管理工具,并且它内置一个负载均衡.它不仅可以保证服务不会中断一直在线,并且提供0秒reload功能,还有其他一系列进程管理.监控功能.并且使用起来非常简单. 嗯嗯,最好的用处就是监控我们的生产环境下的node程序运行状态,让它给我们日以继日的处于工作状态. pm2官方文档 二.为森么要使用pm2 原始社会的我们开发node服务端程序一般过程: 编写好node程序app.js,运行node app.js;或者写入script使用npm运行:打

  • Django uwsgi Nginx 的生产环境部署详解

    配置生产环境 #setting.py 文件中 DEBUG = False # 生产环境 # 允许访问的域名,域名前加一个点表示允许访问该域名下的子域名,比如 www.zmrenwu.com. # test.zmrenwu.com 等二级域名同样允许访问.如果不加前面的点则只允许访问 zmrenwu.com ALLOWED_HOSTS = ["127.0.0.1",".blogzjl.site"] 创建Python虚拟环境 安装 virtualenv sudo pip

  • 基于在生产环境中使用php性能测试工具xhprof的详解

    xhprof 是facebook开源出来的一个php性能测试工具,也可以称之为profile工具,这个词不知道怎么翻译才比较达意.跟之前一直使用的xdebug相比,有很多类似之处.以前对xdebug有一些记录还可以供参考,但是它的缺点是对性能影响太大,即便是开启了profiler_enable_trigger参数,用在生产环境中也是惨不忍睹,cpu立刻就飙到high.而xhprof就显得很轻量,是否记录profile可以由程序控制,因此,用在生产环境中也就成为一种可能.在它的文档上可以看到这样一

  • webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码

    注意: 1,webuploader上传组件会和jQuery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性; enctype="multipart/form-data" 2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置! <!-- 上传拦截,如最大上传值及最小上传值 --> <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制 <bean id="multipartRes

随机推荐