亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC怎么在生產環境禁用Swagger

發布時間:2021-02-18 14:28:34 來源:億速云 閱讀:348 作者:小新 欄目:編程語言

小編給大家分享一下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。太他媽的坑!

看完了這篇文章,相信你對“SpringMVC怎么在生產環境禁用Swagger”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙河市| 建湖县| 襄城县| 五常市| 枝江市| 子长县| 苍南县| 阜康市| 遵义县| 健康| 延庆县| 鄯善县| 富宁县| 大邑县| 五华县| 北票市| 邢台县| 彝良县| 津市市| 桓仁| 娄底市| 句容市| 承德县| 新密市| 肥乡县| 沂源县| 广灵县| 金山区| 崇州市| 靖州| 启东市| 分宜县| 饶平县| 大足县| 临洮县| 潞西市| 三原县| 新田县| 肇源县| 乐都县| 盐城市|