SpringBoot整合Springfox-Swagger2
前言
不管Spring Boot整合還是SpringMVC整合Swagger都基本類似,重點就在于配置Swagger,它的精髓所在就在于配置。 @[toc]
1、Swagger簡介
目前網際網路時代前後端分離已成趨勢,前後端混在一起,前端或者後端無法做到“及時協商,盡早解決”,最終導緻問題集中爆發。解決方案就是前後端通過API進行互動達到相對獨立且松耦合。Swagger就是這樣的一個API架構,Swagger支援多種語言 如:Java,PHP等,它号稱是世界上最流行的API架構!
2、整合前可能遇到的問題
1、 導入好依賴jar包之後,使用注解說找不到之類的問題,如遇到,請參考:所有Intellij IDEA Cannot Resolve Symbol XXX問題的解決方法彙總
2、 版本問題,SpringBoot的版本很多,被內建的架構版本也很多,可能版本高一點或者低一點就可能出現各種bug,這是內建其他架構的通病,這裡得注意一下。如果運作出現一些什麼bug,如果對SpringBoot底層原理不是很了解的可以先百度谷歌一下,找不到建議不妨換個SpringBoot的版本!
3、SpringBoot內建Swagger
注意:jdk 1.8以上才能運作swagger2
1、 導入兩個jar包依賴
io.springfox
springfox-swagger2
2.9.2
springfox-swagger-ui
2、 要想使用Swagger,必須編寫一個配置類來配置 Swagger,這裡的配置類如下
@Configuration //說明這是一個配置類
@EnableSwagger2// 該注解開啟Swagger2的自動配置
public class SwaggerConfig { //随便的一個類名
}
3、 這個時候已經算是初步整合完畢了,啟動項目可通路
http://localhost:8080/swagger-ui.html可以看到swagger的界面,如下;
4、配置Swagger
不管是Spring Boot整合還是SpringMVC整合Swagger都基本類似,重點就在于配置Swagger,它的精髓所在就在于配置,這很關鍵。我們從下圖來全局看看Swagger的四部分重點布局:
4.1、Swagger四部分布局
Swagger執行個體Bean是Docket,是以必須通過配置Docket執行個體來配置Swaggger。
第一部分--API分組:如果沒有配置分組預設是default。通過Swagger執行個體Docket的groupName()方法即可配置分組 第二部分--基本描述:可以通過Swagger執行個體Docket的apiInfo()方法中的ApiInfo執行個體參數配置文檔資訊 第三部分--請求接口清單:在組範圍内,隻要被Swagger2掃描比對到的請求都會在這裡出現。 第四部分--實體清單:隻要實體在請求接口的傳回值上(即使是泛型),都能映射到實體項中!
第四部分注意:并不是因為@ApiModel注解讓實體顯示在Models清單裡,而是隻要出現在接口方法的傳回值上的實體都會顯示在這裡,而@ApiModel和@ApiModelProperty這兩個注解隻是為實體添加注釋的。前者為類添加注釋,後者為類屬性添加注釋。
4.2、第二部分:API基本資訊
先從第二部分開始分析,這樣分析對了解第一部分比較有幫助。
@Configuration
@EnableSwagger2
@ComponentScan("com.yichun.swagger_boot_demo.controller")
public class SwaggerConfig {
@Bean
public Docket docker(){
// 構造函數傳入初始化規範,這是swagger2規範
return new Docket(DocumentationType.SWAGGER_2)
//apiInfo: 添加api詳情資訊,參數為ApiInfo類型的參數,這個參數包含了第二部分的所有資訊比如标題、描述、版本之類的,開發中一般都會自定義這些資訊
.apiInfo(apiInfo())
.groupName("yichun123")
//配置是否啟用Swagger,如果是false,在浏覽器将無法通路,預設是true
.enable(true)
.select()
//apis: 添加過濾條件,
.apis(RequestHandlerSelectors.basePackage("com.yichun.swagger_boot_demo.controller"))
//paths: 這裡是控制哪些路徑的api會被顯示出來,比如下方的參數就是除了/user以外的其它路徑都會生成api文檔
.paths((String a) ->
!a.equals("/user"))
.build();
}
private ApiInfo apiInfo(){
Contact contact = new Contact("名字:name", "個人連結:http://xxx.xxx.com/", "郵箱:XXX");
return new ApiInfo(
"标題内容", // 标題
"描述内容", // 描述
"版本内容:v1.0", // 版本
"連結:http://terms.service.url/", // 組織連結
contact, // 聯系人資訊
"許可:Apach 2.0 ", // 許可
"許可連結:XXX", // 許可連接配接
new ArrayList<>()// 擴充
);
}
1、分析
2、RequestHandlerSelectors過濾
點進RequestHandlerSelectors源碼,分析如下:
4.3、第一部分:配置API分組
實際上,上面的内容就是一個完整的API組
1、配置一個分組 我們之前說過,如果沒有配置分組預設是default。通過Swagger執行個體Docket的groupName()方法即可配置分組,代碼如下:
@Bean
public Docket docket2(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()) // 配置基本API資訊
.groupName("hello") // 配置分組
// 省略配置....
2、如何配置多個分組 很簡單,配置多個分組隻需要配置多個docket即可,代碼如下:
public Docket docket1(){
.groupName("組一")
// 省略配置....
public Docket docket2(){
.groupName("組二")
// 省略配置....
public Docket docket3(){
.groupName("組三")
// 省略配置....
4.4、Swagger2的常用注解
講第三部分和第四部分前,非常有必要先了解swagger2的常用注解,用注解的話,可以給一些比較難了解的屬性或者接口,增加一些配置資訊,讓人更容易閱讀!這點也是swagger2的重中之重!
首先我們得知道一點Swagger的所有注解定義在io.swagger.annotations包下。,這裡隻列出一些常用的注解,如下: 如果要詳細了解這些注解可以參考swagger2 注解說明
4.5、第三部分:API請求清單
請求接口清單:在組範圍内,隻要被Swagger2掃描比對到的請求都會在這裡出現。使用注解能更好的提高閱讀性。
4.6、第四部分:API實體清單
之前說過,隻要實體在請求接口的傳回值上(即使是泛型),都能映射到實體項中!是的,是以我們第一步是先有實體類。
1、 我們先随便建立一個實體類
@ApiModel("使用者實體類")
public class User {
@ApiModelProperty("性别")
public String sex;
@ApiModelProperty(value ="使用者名",allowableValues = "11,12")
public int name;
當然@ApiModelProperty注解裡有很多屬性,也會有許多坑,這裡注意一下,本篇文章暫不概述。
2、 隻要這個實體在請求接口的傳回值上(包括泛型),都能映射到實體項中,是以我們編寫代碼如下:
@GetMapping("/User2")
public User getUser2(){
return new User();
效果如下: 本篇文章非常淺顯,若有不正之處,歡迎批評指正,感激不盡!
歡迎各位關注我的公衆号,裡面有一些java學習資料和一大波java電子書籍,比如說周志明老師的深入java虛拟機、java程式設計思想、核心技術卷、大話設計模式、java并發程式設計實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一起探讨技術,向往技術,追求技術,說好了來了就是盆友喔...
參考:
https://mp.weixin.qq.com/s/0-c0MAgtyOeKx6qzmdUG0w原文位址
https://www.cnblogs.com/yichunguo/p/12665857.html