微服務的流行提供了諸多的方便纸巷,隨著也帶來了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的基本信息
創(chuàng)建SwaggerConfig 啼器,內(nèi)容如下:
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("更多信息旬渠,請訪問http://www.reibang.com/u/3979cb11f079")
.termsOfServiceUrl("https://gitee.com/QuanZhanZhiLu/easy-boot")
.version("1.0")
.build();
}
}
3、swagger的使用
舉個栗子:
@ApiOperation(value = "獲取菜單詳情",notes = "根據(jù)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 = "根據(jù)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當然有解決方案岖免,為什么會出現(xiàn)這問題呢?因為springboot默認的靜態(tài)資源在static下面照捡,而我們看一下swagger-ui.html的目錄結構如下圖
swagger
看到這里基本都明白怎么回事兒了颅湘,我們只需要重寫靜態(tài)資源的路徑即可
6、解決方案
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0);
}
7栗精、API界面
主界面
8闯参、以menu-controller為例
3.png
大家會發(fā)現(xiàn)一個問題,“刪除菜單”的api只有一個悲立,而“獲取菜單”的api則有7個之多鹿寨,可是代碼中我們明明只有一個方法,為什么呢薪夕?對脚草,就是@RequestMapping和@PostMapping的區(qū)別,這也提醒我們盡可能寫代碼的時候要規(guī)范寥殖,一個api只接受一種的請求方式玩讳,不能為了方便讓后面亂了套了。