SpringBoot 2.X Kotlin與Swagger2

image

這里有個地方需要注意稿蹲,在測試WebFlux集成Swagger2的時候存在問題扭勉,看了官方文檔現(xiàn)在2.9.2還沒有集成,所以引入的jar是spring-boot-starter-web,而不是spring-boot-starter-webflux

本章目的

在項目中集成文檔及接口測試平臺苛聘,使用Swagger2可以快速幫助我們編寫最新的API接口文檔涂炎,再也不用擔(dān)心開會前仍忙于整理各種資料了,間接提升了團隊開發(fā)的溝通效率焰盗。

添加Swagger2依賴

在<code>pom.xml</code>中加入Swagger2的依賴

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

創(chuàng)建Swagger2配置

package io.intodream.kotlin04.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.service.Contact
import springfox.documentation.spi.DocumentationType
import springfox.documentation.spring.web.plugins.Docket
import springfox.documentation.swagger2.annotations.EnableSwagger2

/**
 * @description
 * 構(gòu)建一個Swagger2配置文件
 * @author Jwenk
 * @copyright intoDream.io 筑夢科技
 * @email xmsjgzs@163.com
 * @date 2019-03-31,21:55
 */
@Configuration
@EnableSwagger2
class Swagger2Config {

    @Bean
    fun createRestApi(): Docket {
        return Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
    }

    private fun apiInfo(): ApiInfo {
        return ApiInfoBuilder()
                .title("Spring Boot2.X Kotlin 中使用Swagger2構(gòu)建RESTFul APIs")
                .description("更多SpringBoot2.X Kotlin 文章請關(guān)注:惜魚博客")
                .termsOfServiceUrl("https://www.intodream.io")
                .contact(Contact("惜魚", "https://www.tisnz.com", "xmsjgzs@163.com"))
                .version("1.0.0")
                .build()
    }
}

如上代碼所示璧尸,通過<code>@Configuration</code>注解,讓Spring來加載該類配置熬拒。再通過<code>@EnableSwagger2</code>注解來啟用Swagger2爷光。

再通過createRestApi函數(shù)創(chuàng)建Docket的Bean之后,apiInfo()用來創(chuàng)建該Api的基本信息(這些基本信息會展現(xiàn)在文檔頁面中)澎粟。select()函數(shù)返回一個ApiSelectorBuilder實例用來控制哪些接口暴露給Swagger來展現(xiàn)蛀序,本例采用指定掃描的包路徑來定義,Swagger會掃描該包下所有Controller定義的API活烙,并產(chǎn)生文檔內(nèi)容(除了被@ApiIgnore指定的請求)徐裸。

編寫文檔內(nèi)容

在完成上面的配置后,其實Swagger會自動幫我們生成API的文檔啸盏,但是自動生成的文檔顯示并不友好重贺,我們通常需要添加一些額外的信息,這時候就需要通過@ApiOperation注解在API上增加說明回懦,通過@ApiImplicitParams气笙、@ApiImplicitParam注解來給參數(shù)增加說明。

package io.intodream.kotlin04.web

import io.intodream.kotlin04.model.Student
import io.swagger.annotations.Api
import io.swagger.annotations.ApiImplicitParam
import io.swagger.annotations.ApiOperation
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.*
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentMap

/**
 * @description
 *
 * @author Jwenk
 * @copyright intoDream.io 筑夢科技
 * @email xmsjgzs@163.com
 * @date 2019-03-31,22:07
 */
@Api(value = "學(xué)生信息相關(guān)接口", tags = ["學(xué)生"])
@RestController
@RequestMapping("/api/student")
class StudentController {

    private var repository : ConcurrentMap<String, Student> = ConcurrentHashMap<String, Student>()
    private val logger : Logger = LoggerFactory.getLogger(this.javaClass)

    @ApiOperation(value = "保存一條學(xué)生信息")
    @ApiImplicitParam(name = "student", value = "學(xué)生詳細實體student", required = true, dataType = "Student")
    @PostMapping("/")
    fun save(@RequestBody student: Student): Student? {
        logger.info("請求參數(shù):{}", student)
        return repository.put(student.id, student)
    }

    @ApiOperation(value = "獲取學(xué)生列表")
    @GetMapping("/list")
    fun listStudent():List<Student> {
        val studentList = ArrayList<Student>(repository.values)
        logger.info("返回數(shù)據(jù):{}", studentList)
        return studentList
    }

    @ApiOperation(value = "通過學(xué)生編號獲取學(xué)生詳細信息")
    @ApiImplicitParam(name = "studentId", value = "學(xué)生編號", required = true, dataType = "String")
    @GetMapping("/info")
    fun studentInfo(@RequestParam studentId: String): Student? {
        val student : Student? = repository.get(studentId)
        logger.info("studentId:{}, 對應(yīng)的數(shù)據(jù):{}", student)
        return student
    }

    @ApiImplicitParam(name = "studentId", value = "學(xué)生編號", required = true, dataType = "String")
    @ApiOperation(value = "刪除學(xué)生信息")
    @DeleteMapping("/")
    fun deleteStudent(@RequestParam studentId: String): String {
        logger.info("刪除學(xué)生編號:{}", studentId)
        repository.remove(studentId)
        return "success"
    }
}

完成上述代碼添加上怯晕,啟動Spring Boot程序潜圃,訪問:http://localhost:8080/swagger-ui.html。就能看到前文所展示的RESTful API的頁面舟茶。我們可以再點開具體的API請求谭期,以POST類型的/api/student/請求為例堵第,可找到上述代碼中我們配置的Notes信息以及參數(shù)student的描述信息,如下圖所示隧出。

image

image

image

API文檔訪問與調(diào)試

在上圖請求的頁面中踏志,我們看到student的Example Value是個輸入框?是的鸳劳,Swagger除了查看接口功能外狰贯,還提供了調(diào)試測試功能,我們可以點擊上圖中右側(cè)的Model Schema(黃色區(qū)域:它指明了User的數(shù)據(jù)結(jié)構(gòu))赏廓,此時Example Value中就有了student對象的模板涵紊,我們只需要稍適修改,點擊下方“Try it out幔摸!”按鈕摸柄,即可完成了一次請求調(diào)用!

到此我們集成Swagger2就完成了既忆,大家可以多測試一下看返回結(jié)果是否正確驱负,感覺是不是寫接口文檔方便了很多呢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末患雇,一起剝皮案震驚了整個濱河市跃脊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苛吱,老刑警劉巖酪术,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翠储,居然都是意外死亡绘雁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門援所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庐舟,“玉大人,你說我怎么就攤上這事住拭∨猜裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵滔岳,是天一觀的道長瘟檩。 經(jīng)常有香客問我,道長澈蟆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任卓研,我火速辦了婚禮趴俘,結(jié)果婚禮上睹簇,老公的妹妹穿的比我還像新娘。我一直安慰自己寥闪,他們只是感情好太惠,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疲憋,像睡著了一般凿渊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缚柳,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天埃脏,我揣著相機與錄音,去河邊找鬼秋忙。 笑死彩掐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灰追。 我是一名探鬼主播堵幽,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弹澎!你這毒婦竟也來了朴下?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苦蒿,失蹤者是張志新(化名)和其女友劉穎殴胧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刽肠,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡溃肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了音五。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫撰。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖躺涝,靈堂內(nèi)的尸體忽然破棺而出厨钻,到底是詐尸還是另有隱情,我是刑警寧澤坚嗜,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布夯膀,位于F島的核電站,受9級特大地震影響苍蔬,放射性物質(zhì)發(fā)生泄漏诱建。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一碟绑、第九天 我趴在偏房一處隱蔽的房頂上張望俺猿。 院中可真熱鬧茎匠,春花似錦、人聲如沸押袍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谊惭。三九已至汽馋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間圈盔,已是汗流浹背豹芯。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留药磺,地道東北人告组。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像癌佩,于是被迫代替她去往敵國和親木缝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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