Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

前言

上一篇文章介紹了前後端分離框架,如何設計一個簡單易行的API文檔,今天我們就介紹一下如何在SpringBoot2.x項目中應用此Swagger2框架,在使用過程中我們需要注意哪些方面。

開始項目

首先,我們需要一個帶有一些Rest Controller的Spring Boot應用程序,我使用了SpringFox 2.9.2和Spring Boot 2.1.12.RELEASE。

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

添加Swagger2依賴

在pom.xml中加入Swagger2的依賴

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

創建Swagger2配置類

在項目的配置包下面創建Swagger2的配置類Swagger2Config

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

配置信息如下

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

如上代碼所示,通過@Configuration註解,讓Spring來加載該類配置

  • @ EnableSwagger2支持Swagger 2的SpringFox支持。
  • DocumentationType.SWAGGER_2告訴Docketbean我們正在使用Swagger規範的版本2。
  • apiInfo()用來創建該Api的基本信息(這些基本信息會展現在文檔頁面中)。
  • select()創建一個構建器,用於定義哪些控制器及其生成的文檔中應包含哪些方法。
  • apis()定義要包含的類(控制器和模型類)。這裡我們包括所有這些,但您可以通過基礎包,類註釋等來限制它們。

SpringFox會將其檢測為文檔生成源。Controller和Model類。您可以在Docket配置中輕鬆配置它。我們可以使用.apis(RequestHandlerSelectors.any()來包含所有類;當然我們也可以縮小到我們的基礎包

  • paths()允許您根據路徑映射定義應包含哪個控制器的方法。我們現在包括所有這些,但您可以使用正則表達式等限制它。上面的代碼.paths(PathSelectors.any())是代表匹配所有URL。

有時我們還需要只包含特定的URL路徑。可能正在使用API的多個版本以實現向後兼容,但不希望包含歷史版本。也許API的某些部分是內部的,不應該是公共文檔的一部分。無論哪種方式,也可以在Docket中配置基於URL匹配的這種包含。如

<code>1.  `.paths(PathSelectors.ant("/v2/**"))`

/<code>

將其限制為某些正則表達式或Ant樣式的路徑模式,而不是匹配所有路徑的任何路徑。

將Swagger Core註釋添加到模型類中

我們可以在實體類上面進行註釋

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

類級別使用@ApiModel註釋字段級別@ApiModelProperty@ApiModelProperty的示例對於提供示例值非常有用,這不僅適用於用戶的指導,而且還可以在使用Swagger UI作為REST客戶端來測試服務時預填充請求有效負載。Position屬性很方便指定屬性在文檔中顯示的順序。首先提供重要或必需的屬性或屬於一起的組屬性是有用的。否則,屬性將按字母順序列出。

將Swagger Core註釋添加到控制器類

與使用Swagger核心註釋註釋模型類以提供其他元數據相同,您可以註釋控制器及其方法和方法參數。

  • @Api描述了整個控制器
  • @ApiOperation用於方法級別的描述
  • @ApiParam用於方法參數
  • @ApiImplicitParams、@ApiImplicitParam註解來給參數增加說明
Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

配置到這裡,基本的配置就結束了。那是不是就可以執行啟動。

404坑一

我們在啟動後,請求http://localhost:8081/swagger-ui.html 直接報404錯誤;這個問題是因為我們的項目是純的restful前後端分離的項目,我們在application.yml中配置了。

<code>1.  `spring.mvc.resources.add-mapping:false`

/<code>

將其註釋掉熟悉的界面又回來了,這個配置是不自動給靜態資源添加路徑,導致swagger-ui.html找不到資源。怎麼解決呢?修改一下Swagger2Config

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

上面的代碼就是人為的把資源做一下映射關係。

源碼Bug坑二

細心的小夥伴在運行時,應用控制檯打印時,會時不時的報異常,如下:

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

<code>1.  `java.lang.NumberFormatException: For input string: "",出錯的原因呢是因為 空字符串""無法轉成Number。`

/<code>

我們找到Swagger包下拋出異常的類:

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

這個異常就是因為上面源碼上面的判斷條件有問題,如果example屬性不配置的話,在屬性是Integer類型時Long.valueOf(example)時就會報異常,解決方法:

io.springfox:springfox-swagger2:2.9.2中依賴了swagger-models的1.5.20版本,我們可以排除springfox-swagger2中的swagger-models依賴,導入io.swagger:swagger-models的1.5.21版本即可

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

靜態資源404坑三

到現在為止,如果應用是一個純粹的 REST Api 接口服務,那就基本沒什麼問題,但如果應用中仍然有視圖模板、靜態資源時,可能就會出現加載不到靜態資源了。如果出現這個問題,那隻要在Swagger配置類 SwaggerConfig 中加上靜態資源路徑映射即可:

<code>1.  `//路徑根據自己的項目去做映射`

2. `registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");`
/<code>

下面介紹企業項目中比較實用的用法

忽略不想生成文檔的接口

某些Controller 不需要生成API文檔的接口,可以通過@ApiIgnore忽略掉

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

生產環境關閉Swagger

swagger用來在開發階段方便前後端開發。降低交流成本。但是版本上線之後,需要把swagger關閉。

在配置類Swagger2Config中加上條件註解

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

通過@ConditionalOnProperty(prefix = “swagger2”,value = {“enable”},havingValue = “true”)註解實現。

讀取配置文件中前綴為swagger2的配置,屬性名為enable,值為true。

當條件成立,此配置類被激活。

兩個屬性name以及havingValue,其中name用來從application.properties中讀取某個屬性值,如果該值為空,則返回false;

如果值不為空,則將該值與havingValue指定的值進行比較,如果一樣則返回true;否則返回false。如果返回值為false,則該configuration不生效;為true則生效

<code>1.  `swagger2:`

2. `enable: true(在pro環境下不寫此配置)`

/<code>

配置全局參數

在做前後端分離的項目中,每個接口中都會有相同的參數,如:token,用戶令牌;那怎麼方便的在Swagger中使用呢?我們在Swagger2Config配置類中

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)

上面代碼就達到了在每個接口上面加上了token參數,token是非必填的

總結

今天老顧介紹了swagger的一些實戰,當然介紹了不是太完整,有些網上會有所介紹,老顧只是把一些重點,在這裡闡述了。謝謝!!!

Spring Boot 2.x使用Swagger2構建API文檔及跳坑(二)


分享到:


相關文章: