SpringMVC整合SwaggerUI
文章目錄
- SpringMVC整合SwaggerUI
-
- 概念介紹
- 相關資源下載下傳
- 編寫整合代碼
-
- index.html檔案修改
- maven中引入依賴
- springmvc配置檔案中配置資源路徑
- 編寫swagger配置檔案
- 效果展示
- 整合時可能出現的異常
-
- 問題分析
- 問題解決
- 總結
- 參考資料
網上介紹Swagger整合的文章很多,但都是東拼西湊,抄來抄去,講不清楚重點。本文的目的就是希望那些從來沒有接觸過Swagger的朋友能按照本文的步驟快速實作SpringMVC和SwaggerUI的整合,在界面上看到自己的API介紹。如果想深入研究Swagger,本文也附上了相關連結供參考。最終效果如下所示。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcsQXYtJ3bm9CXldWYtlWPzNXZj9mcw1ycz9WL49zYq5EMJpHTxkFVNpXRr10dVtmTw0kaOZkQEJlQapmTCJFVPJTUr50RStmTD5keONTQ6xEbSNjY1h3ViRTOT90dVpXTppUbZNTWX9EeFpmT5VEVN1mUUpFNJRUT4VlMZNTWUpFbCpWTxgzUapmSYRmdOhlW5lTeZBHetlVMCNDT6RGWlZHMyIma1knYoJ1VkZHbuxEbSNjY1lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
概念介紹
初接觸Swagger的朋友一定會被一堆專業名詞搞得暈頭轉向,什麼SpringFox、Swagger、SwaggerUI、SwaggerEditor、SwaggerCodegen、SwaggerInspector等。想做整合,了解下面三個概念即可,想全部了解,可以參考文末連結1,有詳細介紹。
- Swagger: 是一個規範和完整的架構,用于生成、描述、調用和可視化RESTful風格的Web服務。簡單說就是一套生成文檔的架構,要想将其整合進自身的項目,需要實作相關的接口。
- SwaggerUI: 一套前端界面,用于發送請求給背景的Controller,讀取背景傳回的JSON資訊并渲染成相關漂亮的頁面。
- SpringFox: Swagger規範的Spring實作,第三方提供更新和維護。
了解了上述概念,本文要做的事情也就清楚了:利用第三方提供的SpringFox将自身項目中的RESTful API在SwaggerUI中顯示出來。
相關資源下載下傳
任何提及SwaggerUI整合但是不提供相關下載下傳連結的文章都是耍流氓!也許我們能通過官網找到swagger-ui所在github倉庫,但問題是,倉庫那麼多檔案,哪個才是我想要的?
仔細閱讀代碼變更記錄可知,
dist
檔案夾下存放的是release檔案,也就是說我們把項目克隆下來後隻需要使用該檔案夾下的内容即可,如下圖所示。
但是存在這種情況,我們看到别人的代碼中swagger目錄下都有好多檔案,什麼css目錄、font目錄、images目錄、lang目錄等,為什麼這裡的
dist
目錄下内容那麼少?是不是資源連結不對?
實際上,該倉庫為swagger-ui的官方倉庫,是以版本一直在變更,我們見到的那些檔案是老版本才有的資源檔案。如果我們切換到該項目的
2.x
分支,再進入
dist
目錄,是不是看到熟悉的東西了?
編寫整合代碼
接下來我們展示如何整合
2.x
版本的swagger-ui。
index.html檔案修改
對于基于SpringMVC的web項目來說,毫無疑問要把上述資源放到
webapp
目錄下。接下來打開index.html檔案,需要對文檔做幾處修改,如下圖所示。
圖中第一個紅框放開了兩段注解,目的是讓swagger-ui的顯示語言為中文。第二個紅框是根據自身項目的名稱來指定文檔的通路路徑。
需要注意的是,通常的通路路徑是
/項目名/v2/api-docs
,項目名可變,其他固定。為什麼其他部分固定呢?因為springfox中路徑的預設值就是
/項目名/v2/api-docs
。需要變更的話還得自己寫配置檔案,比較麻煩,感興趣的朋友可參考文末連結2。
圖中在通路url中新增了
/rest
,這是因為我的項目中所有RESTful API都在該路徑下。這裡所新增的路徑在後面swagger的配置檔案中都需要加上。
maven中引入依賴
上文已對springfox的概念做了介紹,我們的springmvc項目中需要使用該工具,首先得添加依賴項。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
不同版本的springfox的依賴項最低版本也不一樣,需要自行修改。
springmvc配置檔案中配置資源路徑
資源路徑配置沒什麼好說的,原理和配置js、css等其他資源檔案一樣。
<!-- Swagger支援(暫時注釋掉提高平台性能,需要此功能,可以放開注釋)-->
<context:component-scan base-package="springfox"/>
<bean class="org.test.core.swagger.SwaggerConfig"/>
<mvc:resources mapping="/swagger/**" location="/swagger/"/>
編寫swagger配置檔案
swagger配置檔案的作用是為了告訴springmvc在啟動的時候啟用springfox,并到配置的路徑下掃描RESTful API。下面我們建立配置類,
SwaggerConfig.java
。
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.pathMapping("/rest/")//對請求的路徑增加rest字首
.globalOperationParameters(setHeaderToken())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //隻過濾包含有ApiOperation注解的方法
.paths(PathSelectors.any()) //對所有的路徑進行監控
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("文檔标題")
.description("文檔概述。")
.contact(new Contact("公司名", "公司網址", "聯系人郵箱"))
.version("版本号")
.build();
}
private List<Parameter> setHeaderToken() {
ParameterBuilder tokenPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<>();
tokenPar.name("X-AUTH-TOKEN").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
pars.add(tokenPar.build());
return pars;
}
}
上述配置類具有通用性,該填寫的内容也已注明。需要注意的是,如果我們希望通路每個API的時候都需要帶TOKEN,那麼就需要配置
setHeaderToken()
,這裡配置的TOKEN資訊會顯示在每個API的第一個參數上。反之則不用調用。
如果想對springfox的原理深入了解,可參考文末連結3。
效果展示
根據上述配置類,swagger-ui上顯示的内容如下:
如果配置了通路TOKEN,每個API的效果如下,一一對照上述的配置就知道
setHeaderToken()
方法中每部分的作用了。
整合時可能出現的異常
如果項目能編譯通過,但是啟動時報下述異常,可能就是SpringMVC中相關配置缺失了。
Error creating bean with name ‘documentationPluginsBootstrapper’ defined in URL…Error creating bean with name ‘webMvcRequestHandlerProvider’ defined in URL…No qualifying bean of type [org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping] found for dependency…
問題分析
上述嵌套異常出現的根本原因是沒有找到
RequestMappingInfoHandlerMapping
的實作類,無法
Autowired
。
在springmvc中源碼找到該類,發現它是一個抽象類。
Ctrl+T
一下,發現該類的實作為
RequestMappingHandlerMapping
。是以問題原因就是沒有在springmvc.xml的配置檔案中配置該bean。
問題解決
springmvc.xml中添加下述配置即可解決問題。因為添加了
RequestMappingHandlerMapping
就得添加
RequestMappingHandlerAdapter
,否則會報找不到擴充卡的錯誤。
<!-- 避免IE執行AJAX時,傳回JSON出現下載下傳檔案 -->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- ResponseBody傳回字元串帶雙引号解決 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 注冊handler method和request的mapping關系。 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 啟動Spring MVC的注解功能,完成請求和注解POJO的映射, 配置一個基于注解的定制的WebBindingInitializer,解決日期轉換問題,方法級别的處理器映射 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="cacheSeconds" value="0"/>
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter"/> <!--先進行string轉換-->
<ref bean="mappingJacksonHttpMessageConverter"/><!-- json轉換器 -->
</list>
</property>
</bean>
總結
本文先對swagger的相關概念進行了介紹,接着詳細介紹了整合步驟,并對實際踩過的坑進行了剖析。詳細隻要按照本文的步驟,整個自己項目的swagger-ui是件很容易的事情。
參考資料
- Swagger介紹及使用
- Spring boot中使用springfox來生成Swagger Specification小結
- API管理工具Swagger介紹及Springfox原理分析