Swagger2 学习笔记
前言
博客书链接:点击
版本说明:
jdk=1.8.0_221
maven=3.6.1
springfox-swagger2=2.9.2
参考链接
- swagger2 官方 Java 开发文档: https://hantsy.gitbooks.io/build-a-restful-app-with-spring-mvc-and-angularjs/content/swagger.html
- springfox-swagger2 maven 地址: https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
- springfox-swagger-ui maven 地址: https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
相关链接
- Generating Swagger for a Jersey Project
- Generating Swagger for Spring based APIs
- Generating Swagger for PHP based APIs
什么是 Swagger2
编写和维护接口文档是每个程序员的职责,根据 Swagger2 可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。常用注解swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。
核心依赖
<swagger2.version>2.9.2</swagger2.version>
<!-- SpringFox Swagger UI -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
Swagger2 配置类
package top.simba1949.config;
import com.google.common.base.Predicate;
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.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static com.google.common.base.Predicates.or;
import static springfox.documentation.builders.PathSelectors.regex;
/**
* 需要 @EnableSwagger2 开启 swagger2
* 启动项目后访问 http://ip:port/swagger-ui.html 即可访问
*
* @Author Theodore
* @Date 2019/10/23 18:34
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
/**
* springfox.documentation.spring.web.plugins.Docket 用于构建 Springfox 框架
* @return
*/
@Bean
public Docket commonDocket() {
return new Docket(DocumentationType.SWAGGER_2)
// 如果存在多个 Docket ,需要进行分组命名
.groupName("commonDocket-api")
// 设置 meta 信息
.apiInfo(apiInfo("标题:通用开发接口文档", "描述:通用开发接口文档"))
// 启动 api 选择构建器
.select()
// 哪些包路径下属于通用开发接口文档
.apis(RequestHandlerSelectors.basePackage("top.simba1949.controller.common"))
// 路径筛选 PathSelectors.any() 匹配所有接口,也可以自定义匹配哪些接口
.paths(PathSelectors.any())
// 构建
.build();
}
/**
* 自定义匹配哪些接口
* @return
*/
private Predicate<String> postPaths() {
return or(
regex("/api/posts.*"),
regex("/api/comments.*")
);
}
@Bean
public Docket companyDocket() {
return new Docket(DocumentationType.SWAGGER_2)
// 如果存在多个 Docket ,需要进行分组命名
.groupName("companyDocket-api")
// 设置 meta 信息
.apiInfo(apiInfo("标题:公司开发接口文档", "描述:公司开发接口文档"))
// 启动 api 选择构建器
.select()
// 哪些包路径下属于公司开发接口文档
.apis(RequestHandlerSelectors.basePackage("top.simba1949.controller.company"))
// 路径筛选
.paths(PathSelectors.any())
// 构建
.build();
}
private ApiInfo apiInfo(String title, String description) {
// 名称,站点,邮箱地址
Contact contact = new Contact("simba1949", "https://blog.csdn.net/simba1949", "[email protected]");
return new ApiInfoBuilder()
// 标题
.title(title)
// 描述
.description(description)
// 服务条款链接
.termsOfServiceUrl("http://hantsy.blogspot.com")
// 联系人
.contact(contact)
// 认证许可
.license("Apache License Version 2.0")
// 认证许可链接
.licenseUrl("https://github.com/springfox/springfox/blob/master/LICENSE")
// 版本
.version("2.0")
.build();
}
}
常用注解
- @Api:修饰整个类,描述Controller的作用
- @ApiOperation:描述一个类的一个方法,或者说一个接口
- @ApiParam:单个参数描述
- @ApiModel:用对象来接收参数
- @ApiModelProperty:用对象接收参数时,描述对象的一个字段
- @ApiIgnore:使用该注解忽略这个API,用于类或者方法上
- @ApiImplicitParam:一个请求参数,用于方法上
- @ApiImplicitParams:多个请求参数 ,包含多个 @ApiImplicitParam,用于方法上
注意
@ApiModel 和 @ApiImplicitParams 不推荐同时使用
@Api
强制:tags(数组长度建议为 1)
@Api(
tags = {"公司管理"}, // 字符串数组;用于说明该类的作用(强制)
authorizations = {}, // 字符串数组;用于权限配置
consumes = "", // 字符串, 可选值:"application/json, application/xml";说明接收协议类型
hidden = false, // 布尔类型;是否隐藏该类api
produces = "", // 字符串,可选值:"application/json, application/xml";说明输出协议类型
protocols = "" // 字符串,可选值:http, https, ws, wss;说明支持的协议类型
)
@ApiOperation
强制:value
@ApiOperation(
authorizations = {}, // 字符串数组;用于权限配置
code = 200, // int;响应的HTTP状态代码。
consumes = "", // 字符串,可选值"application/json, application/xml",接收协议类型
hidden = false, // 布尔类型;是否隐藏该接口
httpMethod = "", // 字符串,可选值 "GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS" and "PATCH";接口请求方式
notes = "操作的详细描述。", // 字符串;操作的详细描述。(强制)
produces = "", // 字符串,可选值:"application/json, application/xml";说明输出协议类型
protocols = "", // 字符串,可选值:http, https, ws, wss;说明支持的协议类型
response = String.class, // Class 类型;返回类型
responseContainer = "", // 字符串,可选值"List", "Set" or "Map";声明包装响应的容器。
responseHeaders = {}, // ResponseHeader数组;响应头设置
value = "接口描述或者摘要" // 字符串;接口描述或者摘要
)
@ApiParam
强制:name、value
@ApiParam(
name = "companyName", // 参数名
defaultValue = "ali", // 默认值
example = "示例", // 示例值
value = "公司名称", // 参数简要说明
hidden = false, // 是否隐藏改参数
required = false // 是否必须输入
) String companyName
@ApiModel & @ApiModelProperty
@ApiModel 强制:value、description
@ApiModelProperty 强制:name、value
@ApiModel(
value = "类名",
description = "类的详细描述",
parent = Object.class // 为模型提供超类,以允许描述继承。
)
@ApiModelProperty(
dataType = "int", // 数据类型
hidden = false, // 是否隐藏
name = "id", // 属性名称
required = true, // 是否必须
value = "主键" // 属性描述
)
@ApiIgnore
// 使用该注解忽略这个API,用于类或者方法上
@ApiIgnore(value = "填写忽略该api的原因")
@ApiImplicitParam & @ApiImplicitParams
强制:@ApiImplicitParam :name、value、dataTypeClass(dataType)
强制:@ApiImplicitParams :value
- @ApiImplicitParam :用在请求的方法上,表示一个参数说明
- @ApiImplicitParams :用在请求的方法上,表示一组参数说明
@ApiImplicitParam(
dataType = "int", // 字符串;入参类型
dataTypeClass = Integer.class, // Class 类型;入参类型,如果存在会覆盖 dataType
defaultValue = "", // 字符串;入参默认值
name = "", // 字符串; 入参名
required = true, // 布尔类型;是否必传
value = "对参数的描述", // 字符串类型;表示对参数的描述
paramType = "" // 字符串类型,可选值path/query/body/header/form;表示参数存在位置
)
// value 是 @ApiImplicitParam 的数组
@ApiImplicitParams(
value = {
@ApiImplicitParam(
dataType = "int", // 字符串;入参类型
name = "id", // 字符串; 入参名
value = "公司id值", // 字符串类型;表示对参数的描述
),
@ApiImplicitParam(
dataType = "string", // 字符串;入参类型
name = "companyName", // 字符串; 入参名
value = "公司名称", // 字符串类型;表示对参数的描述
)
}
)