SpringBoot整合Swagger實戰(zhàn)

源碼地址:https://github.com/laolunsi/spring-boot-examples

目前SpringBoot常被用于開發(fā)Java Web應(yīng)用格二,特別是前后端分離項目劈彪。為方便前后端開發(fā)人員進(jìn)行溝通,我們在SpringBoot引入了Swagger顶猜。

Swagger作用于接口沧奴,讓接口數(shù)據(jù)可視化,尤其適用于Restful APi

本節(jié)分兩部分介紹长窄,第一部分是SpringBoot引入Swagger的兩種方式滔吠,第二部分是詳細(xì)介紹在Web接口上應(yīng)用Swagger的注解。

本篇文章使用SpringBoot 2.1.10.RELEASE和springfox-swagger 2.9.2


一挠日、SpringBoot引入Swagger的兩種方式

目前SpringBoot有兩種使用Swagger的方式:

  1. 引入swagger原生依賴springfox-swagger2springfox-swagger2-ui
  2. 引入國內(nèi)Spring4All社區(qū)開發(fā)的依賴swagger-spring-boot-starter

Spring4All出品的依賴采取配置文件的方式進(jìn)行配置疮绷,而原生依賴是通過java config類來設(shè)置的。

1.1 原生配置Swagger

maven依賴:

<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>

swagger配置類:

/**
 * swagger2配置類
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example"))
                .paths(PathSelectors.any())
                .build();
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("基于Swagger構(gòu)建的Rest API文檔")
                .description("更多請咨詢服務(wù)開發(fā)者eknown")
                .contact(new Contact("空夜", "http://www.eknown.cn", "eknown@163.com"))
                .termsOfServiceUrl("http://www.eknown.com")
                .version("1.0")
                .build();
    }
}

從這里可以看出Swagger的一個缺點:無法通過SpringBoot的配置文件進(jìn)行配置嚣潜,所以配置并不能靈活轉(zhuǎn)變冬骚。

spring4all社區(qū)出品的swagger-spring-boot-starter可以解決這個問題。


1.2 基于spring4all配置swagger

Spring4All社區(qū)的博主程序猿DD和小火兩個人開發(fā)了Spring Boot Starter Swagger懂算,目前已經(jīng)在maven官方倉庫上線了只冻。

file

選擇第一個,引入該依賴:

<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>1.9.0.RELEASE</version>
</dependency>

這種方式的Swagger配置是通過application配置文件進(jìn)行的计技。下面給出一個示例:

server:
  port: 8106
swagger:
  base-path: /**
  base-package: 'com.example'
  title: 'spring-boot-swagger-demo'
  description: '基于Swagger構(gòu)建的SpringBoot RESTApi 文檔'
  version: '1.0'
  contact:
    name: '空夜'
    url: 'http://www.eknown.cn'
    email: 'eknown@163.com'

二属愤、應(yīng)用Swagger構(gòu)建接口可視化

2.1 Controller類添加Swagger注解

下面給一個簡單的示例:

@Api(tags = "用戶管理")
@RestController
@RequestMapping(value = "user")
public class UserController {

    // 模擬數(shù)據(jù)庫存儲的用戶
    private static Map<Integer, User> userMap;

    static {
        userMap = new ConcurrentHashMap<>();
        User user = new User(0, "admin", true, new Date());
        userMap.put(user.getId(), user);
    }

    @ApiOperation("列表查詢")
    @GetMapping(value = "")
    public List<User> list() {
        return new ArrayList<>(userMap.values());
    }

    @ApiOperation(value = "獲取用戶詳細(xì)信息", notes = "路徑參數(shù)ID")
    @GetMapping(value = "{id}")
    public User detail(@PathVariable Integer id) {
        return userMap.get(id);
    }

    @ApiOperation(value = "新增或更新用戶信息", notes = "insert和update共用"
            , response = User.class)
    @PostMapping(value = "")
    public User add(@RequestBody User user) {
        if (user == null || user.getId() == null || !StringUtils.isEmpty(user.getName())
                || userMap.containsKey(user.getId())) {
            return null;
        }

        user.setUpdateTime(new Date());
        userMap.put(user.getId(), user);
        return user;
    }


    @ApiOperation(value = "刪除用戶")
    @DeleteMapping(value = "{id}")
    public Boolean delete(@ApiParam(name = "用戶ID", required = true, example = "100") @PathVariable Integer id) {
        if (userMap.containsKey(id)) {
            userMap.remove(id);
            return true;
        }

        return false;
    }

}

2.2 參數(shù)實體類添加Swagger注解

實體類也需要添加一些注解,以便前端開發(fā)人員確定參數(shù)的意義酸役、類型、示例等驾胆。

@ApiModel(description = "用戶類")
public class User {

    @ApiModelProperty(value = "ID", example = "100")
    private Integer id;

    @ApiModelProperty(value = "姓名", example = "laolunsi")
    private String name;

    @ApiModelProperty(value = "是否啟用", example = "1")
    private Boolean enable;

    @ApiModelProperty("更新時間")
    private Date updateTime;

    public User(Integer id, String name, Boolean enable, Date updateTime) {
        this.id = id;
        this.name = name;
        this.enable = enable;
        this.updateTime = updateTime;
    }

    // ... ignore getter and setter methods
}

2.3 測試

啟動項目涣澡,訪問http://localhost:port/swagger-ui.html

如果存在server.servlet.context-path配置,那么訪問地址是http://localhost:port/context-path/swagger-ui.html

file

這樣丧诺,接口就一目了然了入桂,swagger還支持在線測試接口,與postman的作用類似驳阎。


好抗愁,到目前為止馁蒂,我們已經(jīng)成功在SpringBoot項目中整合了Swagger,這樣前后端開發(fā)對接就有了標(biāo)準(zhǔn)蜘腌!


交流學(xué)習(xí)

我的個人網(wǎng)站:http://www.eknown.cn

Git倉庫地址:https://github.com/laolunsi

另外也歡迎大家關(guān)注我的公眾號:猿生物語沫屡,一起學(xué)習(xí)Java/SpringBoot/SpringCloud技術(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撮珠,一起剝皮案震驚了整個濱河市沮脖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芯急,老刑警劉巖勺届,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娶耍,居然都是意外死亡免姿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門榕酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胚膊,“玉大人,你說我怎么就攤上這事奈应±窖冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵杖挣,是天一觀的道長肩榕。 經(jīng)常有香客問我,道長惩妇,這世上最難降的妖魔是什么株汉? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮歌殃,結(jié)果婚禮上乔妈,老公的妹妹穿的比我還像新娘。我一直安慰自己氓皱,他們只是感情好路召,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著波材,像睡著了一般股淡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廷区,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天唯灵,我揣著相機(jī)與錄音,去河邊找鬼隙轻。 笑死埠帕,一個胖子當(dāng)著我的面吹牛垢揩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敛瓷,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叁巨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琐驴?” 一聲冷哼從身側(cè)響起俘种,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝淡,沒想到半個月后宙刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡牢酵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年悬包,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馍乙。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡布近,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丝格,到底是詐尸還是另有隱情撑瞧,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布显蝌,位于F島的核電站预伺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏曼尊。R本人自食惡果不足惜酬诀,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骆撇。 院中可真熱鬧瞒御,春花似錦、人聲如沸神郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涌乳。三九已至践宴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爷怀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工带欢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留运授,地道東北人烤惊。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像吁朦,于是被迫代替她去往敵國和親柒室。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355