Springboot集成Swagger

Springboot集成Swagger

前言

最近新入職了一家公司冈涧,項(xiàng)目開發(fā)完畢發(fā)現(xiàn)沒有寫接口的API文檔工具,問了一下組長,組長告訴我說平常都是口頭交流調(diào)試钞支,用不著接口文檔......想著能少費(fèi)點(diǎn)口水,于是簡單就整合一個(gè)swagger2操刀,下面貼上代碼烁挟。


Jar包依賴

我們用的是Maven項(xiàng)目,所以直接在pom.xml中進(jìn)行依賴骨坑,因?yàn)槲覀冺?xiàng)目使用的Springboot-1.3.5撼嗓,所以依賴比較低,如果是高版本的小伙伴,可以自行下載對(duì)應(yīng)的版本依賴且警。

 <!-- swagger2-->

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger2</artifactId>

<version>2.4.0</version>

</dependency>

<dependency>

<groupId>io.springfox</groupId>

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

<version>2.4.0</version>

</dependency>


配置類

然后我們需要新建一個(gè)swagger配置類


package net.XXXX.xx.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.schema.ModelRef;

import springfox.documentation.service.ApiInfo;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spring.web.plugins.Docket;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

import springfox.documentation.service.Parameter;

import springfox.documentation.builders.ParameterBuilder;

import java.util.ArrayList;

import java.util.List;

@Configuration

@EnableSwagger2

public class SwaggerConfig {

    @Bean

    public Docket createRestApi() {

        return new Docket(DocumentationType.SWAGGER_2)

                .apiInfo(apiInfo())

                .select()

                .apis(RequestHandlerSelectors.basePackage("net.XXX.xx"))//這里是自己的包結(jié)構(gòu)

                .paths(PathSelectors.any())

                .build()

                .globalOperationParameters(globalOperation());

    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder()

                .title("接口示例文檔")

                .description("接口文檔Demo")

                .version("1.0")

                .build();

    }

    //下面代碼可以酌情處理粉捻,因?yàn)槲覀兘涌谛枰衪oken驗(yàn)證,所以需要配置一下token輸入框斑芜,下面代碼就是做這個(gè)功能的

    private List<Parameter> globalOperation(){

        //添加head參數(shù)配置start

        ParameterBuilder tokenPar = new ParameterBuilder();

        List<Parameter> pars = new ArrayList<>();

        //第一個(gè)token為傳參的key肩刃,第二個(gè)token為swagger頁面顯示的值

        tokenPar.name("token").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();

        pars.add(tokenPar.build());

        return pars;

    }

}

注意

如果大家項(xiàng)目中有過濾器,需要將swagger的訪問地址釋放掉押搪,將以下地址進(jìn)行釋放树酪。

swagger-resources/*

swagger-ui.html/*

v2/*

webjars/*

示例Controller

這里我們用一個(gè)GET請求做一下示例,標(biāo)注一下Controller以及參數(shù)大州,請忽略代碼內(nèi)容~

@Api(value = "RevenueBudgetReisterController", description = "收入預(yù)算登記API")
@RestController
@RequestMapping("/revenueBudgetRegister")
public class RevenueBudgetReisterController extends BaseController {

    private RevenueBudgetRegisterService registerService;

    @Autowired
    public RevenueBudgetReisterController(RevenueBudgetRegisterService registerService) {
        this.registerService = registerService;
    }


    @ApiOperation(value = "獲取收入預(yù)算明細(xì)記錄", notes="獲取收入預(yù)算明細(xì)記錄列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "dictionaryName", value = "科目名稱", required = false, dataType = "String", paramType = "query"),
            @ApiImplicitParam(name = "departmentId", value = "部門ID", required = true, dataType = "String", paramType = "query")
    })
    @RequestMapping(value = "/v1.0/revenueBudgetTetails", method = RequestMethod.GET)
    public ResultDto revenueBudgetTetails(String year, String dictionaryName, String departmentId, HttpServletRequest request) {
        try {
            if (null == year || year.equals("")
                    || null == departmentId || "".equals(departmentId)) {
                return new ResultDto(ResultDto.CODE_FAIL, RevenueBudgetDetailsController.ERROR_DATA, null);
            }
            List<RevenueBudgetDetailsRespVo> details = registerService.details(year, dictionaryName, departmentId, getCurrentUser(request));
            return new ResultDto(ResultDto.CODE_SUCCESS, RevenueBudgetDetailsController.SUCCEEDED, details);
        } catch (Exception e) {
            return new ResultDto(ResultDto.CODE_FAIL, e.getMessage(), null);
        }
    }
」


項(xiàng)目啟動(dòng)

訪問地址:http://localhost:8006/swagger-ui.html#/地址端口號(hào)大家請更改為與自己相對(duì)應(yīng)的续语,我這里設(shè)置的是8006

?

bingo!~ 出現(xiàn)這個(gè)界面就表示成功了厦画!( 老漢激動(dòng)摸了摸自己的禿頭疮茄,從輪椅上站了起來,流下了開心的淚水.....)

?

然后我們隨便點(diǎn)進(jìn)去一個(gè)

?

這里會(huì)顯示我們接口的入?yún)⒏睿约罢埱蠓绞降刃畔⒘κ裕绻覀兣渲昧藅oken輸入框,這里則會(huì)顯示出來排嫌。

關(guān)于啟動(dòng)問題

可能集成swagger會(huì)出現(xiàn)下面這個(gè)異常畸裳。?

集成swagger2報(bào)錯(cuò):

java.lang.NoSuchMethodError: com.google.common.XXX

出現(xiàn)這個(gè)異常是因?yàn)閟wagger中內(nèi)置了一個(gè)谷歌的guava包,而項(xiàng)目中也有g(shù)uava的依賴淳地,版本不一致導(dǎo)致的沖突怖糊,我們需要將版本進(jìn)行匹配,或者將低版本的依賴給排除掉颇象,我這里降低了版本伍伤,本來項(xiàng)目中依賴的是swagger-2.9.2的版本,于是降低到了swagger-2.4.0版本遣钳,完美解決~

Swagger常用注解

swagger通過注解表明該接口會(huì)生成文檔扰魂,包括接口名、請求方法蕴茴、參數(shù)劝评、返回信息的等等。

  • @Api:修飾整個(gè)類倦淀,描述Controller的作用
  • @ApiOperation:描述一個(gè)類的一個(gè)方法付翁,或者說一個(gè)接口
  • @ApiParam:單個(gè)參數(shù)描述
  • @ApiModel:用對(duì)象來接收參數(shù)
  • @ApiProperty:用對(duì)象接收參數(shù)時(shí),描述對(duì)象的一個(gè)字段
  • @ApiResponse:HTTP響應(yīng)其中1個(gè)描述
  • @ApiResponses:HTTP響應(yīng)整體描述
  • @ApiIgnore:使用該注解忽略這個(gè)API
  • @ApiError :發(fā)生錯(cuò)誤返回的信息
  • @ApiParamImplicitL:一個(gè)請求參數(shù)
  • @ApiParamsImplicit :多個(gè)請求參數(shù)
  • @ApiImplicitParams:用在請求的方法上晃听,表示一組參數(shù)說明
  • @ApiImplicitParam:參數(shù)說明百侧,用在@ApiImplicitParams中


本次教程就到這里了砰识,謝謝大家閱讀, 寫的有不對(duì)的地方還請多多包涵以及提出佣渴!
??????????????????????????????????????????????????????????????????????????????????????????????原創(chuàng)文章辫狼,轉(zhuǎn)載請標(biāo)明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辛润,隨后出現(xiàn)的幾起案子膨处,更是在濱河造成了極大的恐慌,老刑警劉巖砂竖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件真椿,死亡現(xiàn)場離奇詭異,居然都是意外死亡乎澄,警方通過查閱死者的電腦和手機(jī)突硝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來置济,“玉大人解恰,你說我怎么就攤上這事≌阌冢” “怎么了护盈?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羞酗。 經(jīng)常有香客問我腐宋,道長,這世上最難降的妖魔是什么檀轨? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任脏款,我火速辦了婚禮,結(jié)果婚禮上裤园,老公的妹妹穿的比我還像新娘。我一直安慰自己剂府,他們只是感情好拧揽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腺占,像睡著了一般淤袜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衰伯,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天铡羡,我揣著相機(jī)與錄音,去河邊找鬼意鲸。 笑死烦周,一個(gè)胖子當(dāng)著我的面吹牛尽爆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播读慎,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼漱贱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夭委?” 一聲冷哼從身側(cè)響起幅狮,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎株灸,沒想到半個(gè)月后崇摄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慌烧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年逐抑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杏死。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泵肄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淑翼,到底是詐尸還是另有隱情腐巢,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布玄括,位于F島的核電站冯丙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遭京。R本人自食惡果不足惜胃惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哪雕。 院中可真熱鬧船殉,春花似錦、人聲如沸斯嚎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堡僻。三九已至糠惫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉疫,已是汗流浹背硼讽。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牲阁,地道東北人固阁。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓壤躲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親您炉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柒爵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349