springboot+swagger2

Posted 在下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot+swagger2相关的知识,希望对你有一定的参考价值。

springboot+swagger2

小序

        新公司的第二个项目,是一个配置管理终端机(比如:自动售卖机,银行取款机)的web项目,之前写过一个分模块的springboot框架,就在那个框架基础上进行了改造。改造后的框架可以说能满足普通项目的所有需求,大家可以循环利用哈。后续我会附上摘出来的框架源码,和大家一起学习进步。今天主要是说一下springboot配置在线接口文档swagger2。

添加jar

        在你的maven管理的项目的pom.xml中添加

 1 <dependency>
 2             <groupId>io.springfox</groupId>
 3             <artifactId>springfox-swagger2</artifactId>
 4             <version>2.2.2</version>
 5         </dependency>
 6         <dependency>
 7             <groupId>io.springfox</groupId>
 8             <artifactId>springfox-swagger-ui</artifactId>
 9             <version>2.2.2</version>
10         </dependency>

添加swagger2的配置类

 1 import org.springframework.context.annotation.Bean;
 2 import org.springframework.context.annotation.Configuration;
 3 
 4 import springfox.documentation.builders.ApiInfoBuilder;
 5 import springfox.documentation.builders.PathSelectors;
 6 import springfox.documentation.builders.RequestHandlerSelectors;
 7 import springfox.documentation.service.ApiInfo;
 8 import springfox.documentation.spi.DocumentationType;
 9 import springfox.documentation.spring.web.plugins.Docket;
10 import springfox.documentation.swagger2.annotations.EnableSwagger2;
11 
12 /**
13  * Swagger2配置类 在与spring boot集成时,放在与Application.java同级的目录下。
14  * 通过@Configuration注解,让Spring来加载该类配置。 再通过@EnableSwagger2注解来启用Swagger2。
15  */
16 @Configuration
17 @EnableSwagger2
18 public class Swagger2 {
19 
20     /**
21      * 创建API应用 apiInfo() 增加API相关信息
22      * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
23      * 本例采用指定扫描的包路径来定义指定要建立API的目录。
24      * 
25      * @return
26      */
27     @Bean
28     public Docket createRestApi() {
29         return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
30                 .apis(RequestHandlerSelectors.basePackage("com.11.22.33.controller"))//此处改为你的接口所在的包路径
31                 .paths(PathSelectors.any()).build();
32     }
33 
34     /**
35      * 创建该API的基本信息(这些基本信息会展现在文档页面中) 访问地址:http://项目实际地址/swagger-ui.html
36      * 
37      * @return
38      */
39     private ApiInfo apiInfo() {
40         return new ApiInfoBuilder().title("title").description("description").contact("作者")
41                 .version("1.0").build();//此处改为你自己的项目名称,描述,作者,版本
42     }
43 }

controller添加swagger2注解

  • 例一

        多个参数的话,添加多个@ApiImplicitParam即可,逗号分隔。

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;


@Api(value = "DeviceProductController|终端设备下的产品的相关接口")
@RequestMapping(RequestUrl.DEVEICE_PRODUCT_LIST)
@RestController
public class DeviceProductController {
    @Autowired
    private DeviceProductService deviceProductService;


    @ApiOperation(value="根据设备编号获取产品列表")
    @ApiImplicitParams({
        @ApiImplicitParam(paramType="query", name = "deviceId", value = "设备编号", required = true, dataType = "String")
    })
    @RequestMapping(method = RequestMethod.GET)
    String deveiceInfos(String  deviceId, HttpServletRequest request) {
        String result = deviceProductService.getDeviceProductList(deviceId);
        return result;
    }
}

  • 例二

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;


@Api(value = "DeviceInfoController|终端设备的相关接口")
@RequestMapping(RequestUrl.DEVEICE_INFO_LIST)
@RestController
public class DeviceInfoController {
    @Autowired
    private DeviceInfoService deveiceInfoService;

    @ApiOperation(value="分页获取终端列表datatable的数据格式")
    @RequestMapping(method = RequestMethod.GET)
    String deveiceInfos(@ModelAttribute Gpage page, HttpServletRequest request) {
        String result = deveiceInfoService.deveiceInfos(page, request);
        return result;
    }
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@ApiModel(value="分页对象类型")
@Data
public class Gpage{
     
    @ApiModelProperty(value="每页显示个数" ,required=true)
    private int length = 10;
    @ApiModelProperty(value="开始坐标" ,required=true)
    private int start;
}

在线接口文档访问路径

        我本地启用的是8081端口,所以访问路径是http://localhost:8081/swagger-ui.html

遇到的坑

  • 如果你配置了spring.resources.static-locations,那你就需要把swagger-ui.html也要加进去

        解决办法:新建类MyWebAppConfigurer,添加如下代码即可

 1 import org.springframework.context.annotation.Configuration;
 2 import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
 3 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 4 
 5 @Configuration
 6 public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
 7     /**
 8      * 添加swagger-ui.html
 9      */
10     @Override
11     public void addResourceHandlers(ResourceHandlerRegistry registry) {
12          registry.addResourceHandler("swagger-ui.html")
13          .addResourceLocations("classpath:/META-INF/resources/");
14          registry.addResourceHandler("/webjars*")
15          .addResourceLocations("classpath:/META-INF/resources/webjars/");
16         super.addResourceHandlers(registry);
17     }
18 }

 

  • 如果你配置了拦截器或者过滤器,也要过滤掉swagger的相关路径

以上是关于springboot+swagger2的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot集成Swagger2在线文档

SpringBoot集成Swagger2生成API接口文档

SpringBoot集成Swagger2生成API接口文档

SpringBoot使用Swagger2实现Restful API

Swagger2springboot整合swagger2

SpringBoot+Security+Swagger2配置