SpringBoot + Swagger-UI 實現(xiàn)在線API文檔

寫在前面的视乐,以下是https://github.com/macrozheng/mall-learning?對應(yīng)的學(xué)習(xí)

1.前后端分離情況下兔辅,還是感覺有具體的頁面操作比較安心

2.另外 Swagger-UI 是用來寫在線API文檔的(很關(guān)鍵遥缕,小型可以快速開發(fā)坤学,對應(yīng)Controller層接口改變浮梢,對應(yīng)也相對應(yīng)改變)握巢,不然要用對應(yīng)文檔第三方去寫接口文檔抹腿,語雀似乎是最近開放出來的岛请,可以去了解一下

====================================================

進(jìn)入實際操作

Swagger-UI 是HTML,javascript,CSS的一個集合警绩,可以動態(tài)根據(jù)注解生成在線API文檔

常用注解

1.@Api? 用于修飾Controller類崇败,生成Contriller的相關(guān)文檔信息

2.@ApiOperation: 用于修飾Controller類中的方法,生成接口方法相關(guān)文檔信息

3.@ApiParam : 用于修飾接口的參數(shù)肩祥,生成接口參數(shù)相關(guān)文檔信息 (通常接受前端傳值為vo最佳后室,如果單個或者個別比較少,創(chuàng)建一個vo類專門接受這類參數(shù))

4.@ApiModelProperty : 用于修飾實體類的屬性混狠,當(dāng)實體類是請求參數(shù)或返回結(jié)果時岸霹,直接生成相關(guān)文檔信息

=========================================

配置部分


<!--Swagger-UI API文檔生產(chǎn)工具-->

<dependency>

? <groupId>io.springfox</groupId>

? <artifactId>springfox-swagger2</artifactId>

? <version>2.7.0</version>

</dependency>

<dependency>

? <groupId>io.springfox</groupId>

? <artifactId>springfox-swagger-ui</artifactId>

? <version>2.7.0</version>

</dependency>

====================================================

然后是 Swagger-UI的java配置

有三個不同的選擇

A.生成指定包下面的類的API文檔

B.生成有指定注解的類API文檔

C.生成有指定注解的方法的API文檔

具體代碼

package com.macro.mall.tiny.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;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**

* Swagger2API文檔的配置

*/

@Configuration

@EnableSwagger2

public class Swagger2Config {

? ? @Bean

? ? public Docket createRestApi(){

? ? ? ? return new Docket(DocumentationType.SWAGGER_2)

? ? ? ? ? ? ? ? .apiInfo(apiInfo())

? ? ? ? ? ? ? ? .select()

? ? ? ? ? ? ? ? //為當(dāng)前包下controller生成API文檔

? ? ? ? ? ? ? ? .apis(RequestHandlerSelectors.basePackage("com.macro.mall.tiny.controller"))

? ? ? ? ? ? ? ? //為有@Api注解的Controller生成API文檔

//? ? ? ? ? ? ? ? .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))

? ? ? ? ? ? ? ? //為有@ApiOperation注解的方法生成API文檔

//? ? ? ? ? ? ? ? .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))

? ? ? ? ? ? ? ? .paths(PathSelectors.any())

? ? ? ? ? ? ? ? .build();

? ? }

? ? private ApiInfo apiInfo() {

? ? ? ? return new ApiInfoBuilder()

? ? ? ? ? ? ? ? .title("SwaggerUI演示")

? ? ? ? ? ? ? ? .description("mall-tiny")

? ? ? ? ? ? ? ? .contact("macro")

? ? ? ? ? ? ? ? .version("1.0")

? ? ? ? ? ? ? ? .build();

? ? }

}

======================

然后是controller層添加Swagger注解


這里先是類加上注解 然后對應(yīng)方法加上注解

這里已經(jīng)可以滿足一般的API文檔注解了


=========================================================

進(jìn)階版本

結(jié)合之前的Mybatis Generator注釋的生成規(guī)則

CommentGenerator為Mybatis Generator 的自定義注解生成器,修改addFieldComment方法使其生成Swagger的@ApiModelProperty注解來取代原來的方法注解将饺,添加addJavaFileCOmment方法贡避,使其能在import中導(dǎo)入@ApiModelProperty,否則需要手動導(dǎo)入該類予弧,便于需要生成大量實體類場景

對應(yīng)代碼

package com.macro.mall.tiny.mbg;

import org.mybatis.generator.api.IntrospectedColumn;

import org.mybatis.generator.api.IntrospectedTable;

import org.mybatis.generator.api.dom.java.CompilationUnit;

import org.mybatis.generator.api.dom.java.Field;

import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

import org.mybatis.generator.internal.DefaultCommentGenerator;

import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**

* 自定義注釋生成器

* Created by macro on 2018/4/26.

*/

public class CommentGenerator extends DefaultCommentGenerator {

? ? private boolean addRemarkComments = false;

? ? private static final String EXAMPLE_SUFFIX="Example";

? ? private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty";

? ? /**

? ? * 設(shè)置用戶配置的參數(shù)

? ? */

? ? @Override

? ? public void addConfigurationProperties(Properties properties) {

? ? ? ? super.addConfigurationProperties(properties);

? ? ? ? this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));

? ? }

? ? /**

? ? * 給字段添加注釋

? ? */

? ? @Override

? ? public void addFieldComment(Field field, IntrospectedTable introspectedTable,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? IntrospectedColumn introspectedColumn) {

? ? ? ? String remarks = introspectedColumn.getRemarks();

? ? ? ? //根據(jù)參數(shù)和備注信息判斷是否添加備注信息

? ? ? ? if(addRemarkComments&&StringUtility.stringHasValue(remarks)){

//? ? ? ? ? ? addFieldJavaDoc(field, remarks);

? ? ? ? ? ? //數(shù)據(jù)庫中特殊字符需要轉(zhuǎn)義

? ? ? ? ? ? if(remarks.contains("\"")){

? ? ? ? ? ? ? ? remarks = remarks.replace("\"","'");

? ? ? ? ? ? }

? ? ? ? ? ? //給model的字段添加swagger注解

? ? ? ? ? ? field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\")");

? ? ? ? }

? ? }

? ? /**

? ? * 給model的字段添加注釋

? ? */

? ? private void addFieldJavaDoc(Field field, String remarks) {

? ? ? ? //文檔注釋開始

? ? ? ? field.addJavaDocLine("/**");

? ? ? ? //獲取數(shù)據(jù)庫字段的備注信息

? ? ? ? String[] remarkLines = remarks.split(System.getProperty("line.separator"));

? ? ? ? for(String remarkLine:remarkLines){

? ? ? ? ? ? field.addJavaDocLine(" * "+remarkLine);

? ? ? ? }

? ? ? ? addJavadocTag(field, false);

? ? ? ? field.addJavaDocLine(" */");

? ? }

? ? @Override

? ? public void addJavaFileComment(CompilationUnit compilationUnit) {

? ? ? ? super.addJavaFileComment(compilationUnit);

? ? ? ? //只在model中添加swagger注解類的導(dǎo)入

? ? ? ? if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){

? ? ? ? ? ? compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));

? ? ? ? }

? ? }

}

出現(xiàn)的效果是


然后是運行起來刮吧,看具體效果

接口地址:http://localhost:8080/swagger-ui.html


基本總結(jié),對應(yīng)文字類說明在實體類中生成掖蛤,盡量我們后端可以讓前端知道杀捻,他需要調(diào)用什么,以及調(diào)用的大概字段意思

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚓庭,一起剝皮案震驚了整個濱河市致讥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彪置,老刑警劉巖拄踪,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拳魁,居然都是意外死亡惶桐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姚糊,“玉大人贿衍,你說我怎么就攤上這事【群蓿” “怎么了贸辈?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肠槽。 經(jīng)常有香客問我擎淤,道長,這世上最難降的妖魔是什么秸仙? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任嘴拢,我火速辦了婚禮,結(jié)果婚禮上席吴,老公的妹妹穿的比我還像新娘。我一直安慰自己捞蛋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布拟杉。 她就那樣靜靜地躺著庄涡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捣域。 梳的紋絲不亂的頭發(fā)上卦洽,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天蚤霞,我揣著相機(jī)與錄音酗失,去河邊找鬼规肴。 笑死兑牡,一個胖子當(dāng)著我的面吹牛均函,可吹牛的內(nèi)容都是我干的洛勉。 我是一名探鬼主播牛哺,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奴曙,長吁一口氣:“原來是場噩夢啊……” “哼嘱丢!你這毒婦竟也來了烂完?” 一聲冷哼從身側(cè)響起怀跛,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戒祠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后救拉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡豺撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年绳慎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗炉。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轻专,死狀恐怖宗收,靈堂內(nèi)的尸體忽然破棺而出混稽,到底是詐尸還是另有隱情各淀,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站唱星,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏间聊。R本人自食惡果不足惜攒盈,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哎榴。 院中可真熱鬧型豁,春花似錦、人聲如沸尚蝌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飘言。三九已至氏豌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間热凹,已是汗流浹背泵喘。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留般妙,地道東北人纪铺。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像碟渺,于是被迫代替她去往敵國和親鲜锚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容