配置 Swagger2 接口文檔引擎

學(xué)習(xí)完整課程請移步 互聯(lián)網(wǎng) Java 全棧工程師

本節(jié)視頻

手寫文檔存在的問題

  • 文檔需要更新的時候蟆肆,需要再次發(fā)送一份給前端谨读,也就是文檔更新交流不及時。
  • 接口返回結(jié)果不明確
  • 不能直接在線測試接口钻趋,通常需要使用工具烧董,比如:Postman
  • 接口文檔太多毁靶,不好管理

使用 Swagger 解決問題

Swagger 也就是為了解決這個問題,當(dāng)然也不能說 Swagger 就一定是完美的逊移,當(dāng)然也有缺點(diǎn)预吆,最明顯的就是代碼植入性比較強(qiáng)。

Maven

增加 Swagger2 所需依賴胳泉,pom.xml 配置如下:

<!-- Swagger2 Begin -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
<!-- Swagger2 End -->

配置 Swagger2

注意:RequestHandlerSelectors.basePackage("com.funtl.myshop.service") 為 Controller 包路徑拐叉,不然生成的文檔掃描不到接口

創(chuàng)建一個名為 Swagger2Configuration 的 Java 配置類,代碼如下:

package com.funtl.myshop.commons.service.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class Swagger2Configuration {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.funtl.myshop.service"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("MyShop API 文檔")
                .description("MyShop API 網(wǎng)關(guān)接口胶背,http://www.funtl.com")
                .termsOfServiceUrl("http://www.funtl.com")
                .version("1.0.0")
                .build();
    }
}

啟用 Swagger2

Application 中加上注解 @EnableSwagger2 表示開啟 Swagger

package com.funtl.myshop.service.reg;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = "com.funtl.myshop")
@MapperScan(basePackages = "com.funtl.myshop.commons.mapper")
@EnableBinding({Source.class})
@EnableAsync
@EnableSwagger2
public class MyShopServiceRegApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyShopServiceRegApplication.class, args);
    }
}

使用 Swagger2

在 Controller 中增加 Swagger2 相關(guān)注解巷嚣,代碼如下:

/**
 * 用戶注冊
 *
 * @param tbUser
 * @return
 */
@ApiOperation(value = "用戶注冊", notes = "以實(shí)體類為參數(shù)喘先,注意用戶名和郵箱不要重復(fù)")
@PostMapping(value = {""})
public AbstractBaseResult reg(@ApiParam(name = "tbUser", value = "用戶模型") TbUser tbUser) {
    // 數(shù)據(jù)校驗(yàn)
    AbstractBaseResult validator = validator(tbUser);
    if (validator != null) {
        return validator;
    }

    // 判斷用戶名是否重復(fù)
    if (!tbUserService.unique("username", tbUser.getUsername())) {
        return error("用戶名重復(fù)钳吟,請重試", null);
    }

    // 判斷郵箱是否重復(fù)
    if (!tbUserService.unique("email", tbUser.getEmail())) {
        return error("郵箱重復(fù),請重試", null);
    }

    // 設(shè)置密碼加密
    if (StringUtils.isNotBlank(tbUser.getPassword())) {
        tbUser.setPassword(DigestUtils.md5DigestAsHex(tbUser.getPassword().getBytes()));
    }

    // 密碼為空
    else {
        return error("密碼不可為空", null);
    }

    // 注冊用戶
    TbUser user = tbUserService.save(tbUser);
    if (user != null) {
        response.setStatus(HttpStatus.CREATED.value());
        // 發(fā)送注冊成功通知到消息隊列
        regService.sendEmail(user);
        return success(request.getRequestURI(), user);
    }

    return error("注冊失敗窘拯,請重試", null);
}

訪問 Swagger2

訪問地址:http://ip:port/swagger-ui.html

Swagger 常用注解說明

Swagger 通過注解表明該接口會生成文檔红且,包括接口名、請求方法涤姊、參數(shù)暇番、返回信息的等等。

常用注解

  • @Api:修飾整個類思喊,描述 Controller 的作用
  • @ApiOperation:描述一個類的一個方法壁酬,或者說一個接口
  • @ApiParam:單個參數(shù)描述
  • @ApiModel:用對象來接收參數(shù)
  • @ApiProperty:用對象接收參數(shù)時,描述對象的一個字段
  • @ApiResponse:HTTP 響應(yīng)其中 1 個描述
  • @ApiResponses:HTTP 響應(yīng)整體描述
  • @ApiIgnore:使用該注解忽略這個API
  • @ApiError:發(fā)生錯誤返回的信息
  • @ApiImplicitParam:一個請求參數(shù)
  • @ApiImplicitParams:多個請求參數(shù)

@Api

說明:用在請求的類上恨课,表示對類的說明

常用參數(shù):

  • tags="說明該類的作用舆乔,非空時將覆蓋 value 的值"
  • value="描述類的作用"

其他參數(shù):

  • description 對 api 資源的描述,在 1.5 版本后不再支持
  • basePath 基本路徑可以不配置剂公,在 1.5 版本后不再支持
  • position 如果配置多個 Api 想改變顯示的順序位置希俩,在 1.5 版本后不再支持
  • produces 設(shè)置 MIME 類型列表(output),例:"application/json, application/xml"纲辽,默認(rèn)為空
  • consumes 設(shè)置 MIME 類型列表(input)颜武,例:"application/json, application/xml"璃搜,默認(rèn)為空
  • protocols 設(shè)置特定協(xié)議,例:http鳞上, https这吻, ws, wss
  • authorizations 獲取授權(quán)列表(安全聲明)篙议,如果未設(shè)置橘原,則返回一個空的授權(quán)值。
  • hidden 默認(rèn)為 false涡上,配置為 true 將在文檔中隱藏

示例:

@Api(tags="登錄請求")
@Controller
public class LoginController {}

@ApiOperation

說明:用在請求的方法上趾断,說明方法的用途、作用

常用參數(shù):

  • value="說明方法的用途吩愧、作用"
  • notes="方法的備注說明"

其他參數(shù):

  • tags 操作標(biāo)簽芋酌,非空時將覆蓋value的值
  • response 響應(yīng)類型(即返回對象)
  • responseContainer 聲明包裝的響應(yīng)容器(返回對象類型)。有效值為 "List", "Set" or "Map"雁佳。
  • responseReference 指定對響應(yīng)類型的引用脐帝。將覆蓋任何指定的response()類
  • httpMethod 指定HTTP方法,"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" and "PATCH"
  • position 如果配置多個Api 想改變顯示的順序位置糖权,在1.5版本后不再支持
  • nickname 第三方工具唯一標(biāo)識堵腹,默認(rèn)為空
  • produces 設(shè)置MIME類型列表(output),例:"application/json, application/xml"星澳,默認(rèn)為空
  • consumes 設(shè)置MIME類型列表(input)疚顷,例:"application/json, application/xml",默認(rèn)為空
  • protocols 設(shè)置特定協(xié)議禁偎,例:http腿堤, https, ws如暖, wss笆檀。
  • authorizations 獲取授權(quán)列表(安全聲明),如果未設(shè)置盒至,則返回一個空的授權(quán)值酗洒。
  • hidden 默認(rèn)為false, 配置為true 將在文檔中隱藏
  • responseHeaders 響應(yīng)頭列表
  • code 響應(yīng)的HTTP狀態(tài)代碼枷遂。默認(rèn) 200
  • extensions 擴(kuò)展屬性列表數(shù)組

示例:

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登錄檢測", notes="根據(jù)用戶名樱衷、密碼判斷該用戶是否存在")
public UserModel login(@RequestParam(value = "name", required = false) String account,
@RequestParam(value = "pass", required = false) String password){}

@ApiImplicitParams

說明:用在請求的方法上,表示一組參數(shù)說明登淘;@ApiImplicitParam:用在 @ApiImplicitParams 注解中箫老,指定一個請求參數(shù)的各個方面

常用參數(shù):

  • name:參數(shù)名,參數(shù)名稱可以覆蓋方法參數(shù)名稱黔州,路徑參數(shù)必須與方法參數(shù)一致
  • value:參數(shù)的漢字說明耍鬓、解釋
  • required:參數(shù)是否必須傳阔籽,默認(rèn)為 false (路徑參數(shù)必填)
  • paramType:參數(shù)放在哪個地方
    • header 請求參數(shù)的獲取:@RequestHeader
    • query 請求參數(shù)的獲壬瘛:@RequestParam
    • path(用于 restful 接口)--> 請求參數(shù)的獲劝手啤:@PathVariable
    • body(不常用)
    • form(不常用)
  • dataType:參數(shù)類型,默認(rèn) String涣达,其它值 dataType="Integer"
  • defaultValue:參數(shù)的默認(rèn)值

其他參數(shù)(@ApiImplicitParam):

  • allowableValues 限制參數(shù)的可接受值在辆。1.以逗號分隔的列表 2.范圍值 3.設(shè)置最小值/最大值
  • access 允許從API文檔中過濾參數(shù)。
  • allowMultiple 指定參數(shù)是否可以通過具有多個事件接受多個值度苔,默認(rèn)為 false
  • example 單個示例
  • examples 參數(shù)示例匆篓。僅適用于 BodyParameters

示例:

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登錄檢測", notes="根據(jù)用戶名、密碼判斷該用戶是否存在")
@ApiImplicitParams({
    @ApiImplicitParam(name = "name", value = "用戶名", required = false, paramType = "query", dataType = "String"),
    @ApiImplicitParam(name = "pass", value = "密碼", required = false, paramType = "query", dataType = "String")
})
public UserModel login(@RequestParam(value = "name", required = false) String account,
@RequestParam(value = "pass", required = false) String password){}

@ApiModel

說明:用于響應(yīng)類上寇窑,表示一個返回響應(yīng)數(shù)據(jù)的信息(這種一般用在 POST 創(chuàng)建的時候鸦概,使用 @RequestBody 這樣的場景,請求參數(shù)無法使用 @ApiImplicitParam 注解進(jìn)行描述的時候)甩骏;@ApiModelProperty:用在屬性上窗市,描述響應(yīng)類的屬性

其他參數(shù)(@ApiModelProperty):

  • value 此屬性的簡要說明。
  • name 允許覆蓋屬性名稱
  • allowableValues 限制參數(shù)的可接受值饮笛。1.以逗號分隔的列表 2.范圍值 3.設(shè)置最小值/最大值
  • access 允許從 API 文檔中過濾屬性咨察。
    • notes 目前尚未使用。
  • dataType 參數(shù)的數(shù)據(jù)類型福青∩阌可以是類名或者參數(shù)名,會覆蓋類的屬性名稱素跺。
  • required 參數(shù)是否必傳二蓝,默認(rèn)為 false
  • position 允許在類中對屬性進(jìn)行排序誉券。默認(rèn)為 0
  • hidden 允許在 Swagger 模型定義中隱藏該屬性指厌。
  • example 屬性的示例。
  • readOnly 將屬性設(shè)定為只讀踊跟。
  • reference 指定對相應(yīng)類型定義的引用踩验,覆蓋指定的任何參數(shù)值

示例:

@ApiModel(value="用戶登錄信息", description="用于判斷用戶是否存在")
public class UserModel implements Serializable{

   private static final long serialVersionUID = 1L;

   /**
    * 用戶名
    */
   @ApiModelProperty(value="用戶名")
   private String account;

   /**
     * 密碼
     */
    @ApiModelProperty(value="密碼")
   private String password;
}

@ApiResponses

說明:用在請求的方法上,表示一組響應(yīng)商玫;@ApiResponse:用在 @ApiResponses 中箕憾,一般用于表達(dá)一個錯誤的響應(yīng)信息

常用參數(shù):

  • code:數(shù)字,例如 400
  • message:信息拳昌,例如 "請求參數(shù)沒填好"
  • response:拋出異常的類

示例:

@ResponseBody
@PostMapping(value="/update/{id}")
@ApiOperation(value = "修改用戶信息",notes = "打開頁面并修改指定用戶信息")
@ApiResponses({
    @ApiResponse(code=400,message="請求參數(shù)沒填好"),
    @ApiResponse(code=404,message="請求路徑?jīng)]有或頁面跳轉(zhuǎn)路徑不對")
})
public JsonResult update(@PathVariable String id, UserModel model){}

@ApiParam

說明:用在請求方法中袭异,描述參數(shù)信息

常用參數(shù):

  • name:參數(shù)名稱,參數(shù)名稱可以覆蓋方法參數(shù)名稱炬藤,路徑參數(shù)必須與方法參數(shù)一致
  • value:參數(shù)的簡要說明御铃。
  • defaultValue:參數(shù)默認(rèn)值
  • required:屬性是否必填碴里,默認(rèn)為 false (路徑參數(shù)必須填)

以實(shí)體類為參數(shù):

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登錄檢測", notes="根據(jù)用戶名、密碼判斷該用戶是否存在")
public UserModel login(@ApiParam(name = "model", value = "用戶信息Model") UserModel model){}

其他參數(shù):

  • allowableValues 限制參數(shù)的可接受值上真。1.以逗號分隔的列表 2.范圍值 3.設(shè)置最小值/最大值
  • access 允許從 API 文檔中過濾參數(shù)咬腋。
  • allowMultiple 指定參數(shù)是否可以通過具有多個事件接受多個值,默認(rèn)為 false
  • hidden 隱藏參數(shù)列表中的參數(shù)睡互。
  • example 單個示例
  • examples 參數(shù)示例根竿。僅適用于 BodyParameters

示例:

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登錄檢測", notes="根據(jù)用戶名、密碼判斷該用戶是否存在")
public UserModel login(@ApiParam(name = "name", value = "用戶名", required = false) @RequestParam(value = "name", required = false) String account,
    @ApiParam(name = "pass", value = "密碼", required = false) @RequestParam(value = "pass", required = false) String password){}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末就珠,一起剝皮案震驚了整個濱河市寇壳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妻怎,老刑警劉巖九巡,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹂季,居然都是意外死亡冕广,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門偿洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撒汉,“玉大人,你說我怎么就攤上這事涕滋〔欠” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵宾肺,是天一觀的道長溯饵。 經(jīng)常有香客問我,道長锨用,這世上最難降的妖魔是什么丰刊? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮增拥,結(jié)果婚禮上啄巧,老公的妹妹穿的比我還像新娘。我一直安慰自己掌栅,他們只是感情好秩仆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猾封,像睡著了一般澄耍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天齐莲,我揣著相機(jī)與錄音卿城,去河邊找鬼。 笑死铅搓,一個胖子當(dāng)著我的面吹牛瑟押,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播星掰,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼多望,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氢烘?” 一聲冷哼從身側(cè)響起怀偷,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎播玖,沒想到半個月后椎工,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜀踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年维蒙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片果覆。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡颅痊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出局待,到底是詐尸還是另有隱情斑响,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布钳榨,位于F島的核電站舰罚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏薛耻。R本人自食惡果不足惜营罢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昭卓。 院中可真熱鬧愤钾,春花似錦、人聲如沸候醒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倒淫。三九已至,卻和暖如春败玉,著一層夾襖步出監(jiān)牢的瞬間敌土,已是汗流浹背镜硕。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返干,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓矩欠,卻偏偏與公主長得像财剖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躺坟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348