springboot使用swagger2及遇到的小問題

微服務的流行提供了諸多的方便,隨着也帶來了N多的API,而swagger2正是一個對API管理的很好的“工具”,本文主要介紹springboot對swagger2的集成,以及集成中遇到的無法訪問的問題。

1、pom添加依賴

      <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>

2、配置swagger的基本信息

創建SwaggerConfig ,內容如下:

package com.mos.eboot.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;

/**
 * @author 小塵哥
 * api 地址:http://localhost:9090/swagger-ui.html
 */
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.mos.eboot.service"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("eboot-api文檔")
                .description("更多信息,請訪問https://www.jianshu.com/u/3979cb11f079")
                .termsOfServiceUrl("https://gitee.com/QuanZhanZhiLu/easy-boot")
                .version("1.0")
                .build();
    }
}

3、swagger的使用

舉個栗子:

    @ApiOperation(value = "獲取菜單詳情",notes = "根據id獲取菜單")
    @ApiImplicitParam(name = "id", value = "菜單ID", required = true, dataType = "String", paramType = "query")
    @RequestMapping("get-by-id")
    public ResultModel<SysMenu> getById(@RequestParam("id") String id) {
        SysMenu menu = menuService.selectById(id);
        menu.setParentNode(menuService.selectById(menu.getParentId()));
        return new ResultModel<>(ResultStatus.SUCCESS, menu);
    }

    @ApiOperation(value = "刪除菜單",notes = "根據id刪除菜單")
    @ApiImplicitParam(name = "id", value = "菜單ID", required = true, dataType = "String", paramType = "query")
    @PostMapping("del-by-id")
    public ResultModel<String> delById(@RequestParam("id") String id) {
        return this.basicResult(menuService.deleteById(id));
    }

4、查看ui界面

訪問:http://[ip]:[端口]/swagger-ui.html
404.png
驚不驚喜?意不意外?

5、原因

出了bug當然有解決方案,爲什麼會出現這問題呢?因爲springboot默認的靜態資源在static下面,而我們看一下swagger-ui.html的目錄結構如下圖
swagger
看到這裏基本都明白怎麼回事兒了,我們只需要重寫靜態資源的路徑即可

6、解決方案

  @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0);
    }

7、API界面

主界面

8、以menu-controller爲例

3.png
大家會發現一個問題,“刪除菜單”的api只有一個,而“獲取菜單”的api則有7個之多,可是代碼中我們明明只有一個方法,爲什麼呢?對,就是@RequestMapping和@PostMapping的區別,這也提醒我們儘可能寫代碼的時候要規範,一個api只接受一種的請求方式,不能爲了方便讓後面亂了套了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章