目录
一、简介
Swagger是一个简单但功能强大的API表达工具。使用Swagger生成API,
我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。
swagger官网
swagger在线编辑器
二、SpringBoot集成Swagger3
步骤:
1、新建springboot项目
2、导入swagger依赖Maven
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
这里用的是 springfox,Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则 是这项技术的具体实现。
3、开启swagger,在springboot启动类中添加@EnableOpenApi注解
@SpringBootApplication
@EnableOpenApi
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
}
}
4、创建一个测试controller
@RestController
public class HelloController {
@GetMapping(value = "/hello")
public String hello(){
return "hello";
}
}
启动项目测试
注意:
springboot2.6.X启动项目会报Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException。
原因是:Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。
解决办法: 在application.yml中添加以下配置
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
5、访问swagger接口文档 http://localhost:8080/swagger-ui/
6、展开HelloWorldController接口定义
展开hello接口
点击Try it out
三、Swagger3 常用注解
1.@Api
说明:用在处理类上,表示对类的说明
常用属性:
- tags:描述该类的作用
2.@ApiOperation
说明:用在请求的方法上,说明方法的作用和备注
常用属性:
- value:描述方法的作用
- notes:备注说明
3.@ApiImplicitParams
说明:用在请求的方法上,表示一组参数说明
常用属性:
- @ApiImplicitParams
说明:定义参数各项信息
常用属性:- name:参数名称
- value:参数说明
- required:是否必传,值为Boolean类型
- paramType:参数放在哪个地方,常用值为:query(放在请求参数中,@RequestParam获取参数)、header(放在请求头中,@RequestHeader获取参数)、path(用于restful接口,@PathVariable获取参数)
- dataType:参数类型,默认String
- defaultValue:参数的默认值
4.@ApiResponses
说明:用在请求的方法上,表示一组响应
常用属性:
- @ApiResponse
说明:一般用于表达一个错误的响应信息
常用属性:- code:响应码
- message:响应信息
- response:抛出异常的类
5.@ApiModel
说明:用于响应类上,描述响应的数据对象
6.@ApiModelProperty
说明:用在JavaBean属性上,描述响应类的属性或请求类的属性
常用属性:
- name:参数名称
- value:参数说明
- required:是否必传,值为Boolean类型
- dataType:参数类型,默认String
示例一:@Api、@ApiOperation
@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
@ApiOperation(value = "hello接口", notes = "<h1>这是备注说明</h1>")
@GetMapping(value = "/hello")
public String Description() {
return "hello";
}
}
示例二:@ApiImplicitParams
@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
@PostMapping(value = "/findInfo")
@ApiOperation(value = "查询信息", notes = "<h1>这是备注说明</h1>")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "value", value = "值", required = true, paramType = "query"),
@ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query", dataType = "Integer")
})
public String findInfo(String value, Integer id) {
return value + "====" + id;
}
}
示例三:@ApiResponses、@ApiModel、@ApiModelProperty
@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
@GetMapping("/getStudent/{id}")
@ApiOperation(value = "获取学生信息", notes = "<h1>这是备注说明</h1>")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "path", dataType = "Integer")
})
@ApiResponses({
@ApiResponse(code = 600, message = "业务错误"),
@ApiResponse(code = 404, message = "找不到路径"),
@ApiResponse(code = 400, message = "参数错误"),
@ApiResponse(code = 500, message = "程序错误")
})
public Student getStudent(@PathVariable("id") Integer id) {
Student student = new Student();
student.setId(id);
student.setName("张三");
student.setAge(25);
student.setEmail("qwe@123");
return student;
}
}
Student.java
@ApiModel("学生实体信息")
public class Student {
@ApiModelProperty(name = "id", value = "编号", dataType = "Integer")
private Integer id;
@ApiModelProperty(name = "name", value = "姓名", required = true, dataType = "String")
private String name;
@ApiModelProperty(name = "age", value = "年龄", required = true, dataType = "Integer")
private Integer age;
@ApiModelProperty(name = "email", value = "邮箱", required = true, dataType = "String")
private String email;
}
四、API信息配置
默认情况,显示的API信息如下
修改默认配置,可以新建一个Java Config重写ApiConfig
以及Docket
来实现
@Configuration
public class Swagger3Config {
/**
* 配置Docket
* @return
*/
@Bean
public Docket createDocket() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfo());
}
/**
* 配置Docket
* @return
*/
@Bean
public ApiInfo createApiInfo() {
return new ApiInfo(
"CK Swagger Document",
"CK API Document",
"0.0.1",
"urn:tos",
new Contact("CK", "http://localhost:8080/", "123456@163.com"),
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<>()
);
}
}
通过ApiInfo源码查看构造参数
public ApiInfo(String title, String description, String version, String termsOfServiceUrl, Contact contact, String license, String licenseUrl, Collection<VendorExtension> vendorExtensions) {
this.title = title;
this.description = description;
this.version = version;
this.termsOfServiceUrl = termsOfServiceUrl;
this.contact = contact;
this.license = license;
this.licenseUrl = licenseUrl;
this.vendorExtensions = new ArrayList(vendorExtensions);
}
五、Docket 开关&过滤&分组配置
通过设置Docket,可以配置很多功能,比如是否开启swagger,过滤,分组等;
1.Docket开关设置
一般情况,只有在开发环境才会用到swagger,正式环境需要关闭swagger,一个是安全问题,还有一个是用了swagger会影响系统运行速度;
通过配置Docket对象的enable方法实现swagger启用和禁用
/**
* 配置Docket
* @return
*/
@Bean
public Docket createDocket() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(createApiInfo())
.enable(false);
}
重启后在访问,可以看到已经被禁用了
2.设置过滤API
有些情况,我们需要指定包路径下的类生成API,或者根据前端用户路径请求过滤;
使用过滤要调用select()方法,select()方法有两种方法实现过滤:
1、根据包路径来扫描指定类的API
具体示例:
/**
* 配置Docket
* @return
*/
@Bean
public Docket createDocket() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfo())
.enable(true)
//设置过滤
.select()
//RequestHandlerSelectors.basePackage()设置包路径来扫描指定类的API;any() 方法是默认所有都有效, none()方法都无效;withClassAnnotation()根据类注解, withMethodAnnotation()是根据方法注解;
.apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test1"))
//最后加build()方法
.build();
}
2、根据请求路径来扫描API
具体示例:
/**
* 配置Docket
* @return
*/
@Bean
public Docket createDocket() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfo())
.enable(true)
//设置过滤
.select()
//PathSelectors.ant()设置匹配路径;any()是匹配任意路径, none()是都不匹配, regex()是正则匹配;
.paths(PathSelectors.ant("/test1/**"))
.build();
}
3.设置分组
在实际项目开发中,把复杂项目划分多模块给多个小组或者多个人负责开发,所以每个小组或者个人要 实现自己的分组,方便查找到API接口开发负责人,沟通和处理问题;
通过配置Docket对象的groupName方法设置组名;
/**
* 配置Docket
* @return
*/
@Bean
public Docket createDocket() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfo())
.enable(true)
.groupName("Group A");
}
重启项目,默认组名改为了Group A
配置多个组
在controller包下创建两个子包并创建Controller,模拟两个模块
在Swagger3配置类中配置两个Docket和ApiInfo,通过Docket对象的apis方法为每个组扫描指定包下的API;
具体代码:
package com.example.swaggerdemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 java.util.ArrayList;
@Configuration
public class Swagger3Config {
/**
* 配置DocketA
* @return
*/
@Bean
public Docket createDocketA() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfoA())
.enable(true)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test1"))
.build()
.groupName("Group A");
}
/**
* 配置DocketB
* @return
*/
@Bean
public Docket createDocketB() {
return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
.apiInfo(createApiInfoB())
.enable(true)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test2"))
.build()
.groupName("Group B");
}
/**
* 配置ApiInfoA
* @return
*/
@Bean
public ApiInfo createApiInfoA() {
return new ApiInfo(
"CK GroupA Swagger Document",
"CK API Document",
"0.0.1",
"urn:tos",
new Contact("CK", "http://localhost:8080/", "123456@163.com"),
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<>()
);
}
/**
* 配置ApiInfoB
* @return
*/
@Bean
public ApiInfo createApiInfoB() {
return new ApiInfo(
"CK Swagger Document",
"CK GroupB API Document",
"0.0.1",
"urn:tos",
new Contact("CK", "http://localhost:8080/", "123456@163.com"),
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList<>()
);
}
}
重启项目
组Group A的API文档:
组Group B的API文档: