SpringBoot 使用Swagger文档
2019-09-27 本文已影响0人
月弦
前言
Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。
1、pom.xml文件
添加swagger2和swagger-ui依赖。
<properties>
<java.version>1.8</java.version>
<swagger.version>2.9.2</swagger.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--swagger-ui-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2、配置文件
和整合jpa一样。
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
3、swagger2文档信息配置
文档信息配置,Swagger 还支持设置一些文档的版本号、联系人邮箱、网站、版权、开源协议等等信息,通过创建一个 ApiInfo 对象,并且使用 Docket.appInfo() 方法来设置。
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.huzh.springbootswagger.controller"))
.paths(PathSelectors.any())
.build();
}
public ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("spring-boot-demo")
.description("这是一个简单的 Swagger API 演示")
.contact(new Contact("企鹅十五号", "https://www.jianshu.com/u/cd874c9edf31", "*****@qq.com"))
.version("1.0.0-SNAPSHOT")
.build();
}
}
4、实体类
实体描述,我们可以通过 @ApiModel 和 @ApiModelProperty 注解来对我们 API 中所涉及到的对象做描述。
@Entity
@ApiModel(description = "用户实体")
public class User {
@ApiModelProperty(value = "主键id", hidden = true)
@GeneratedValue
@Id
Integer id;
@ApiModelProperty(value = "用户名称")
@NotNull
@Column
private String username;
@ApiModelProperty(value = "用户密码")
@Column
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
}
public User(Integer id, @NotNull String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User(@NotNull String username, String password) {
this.username = username;
this.password = password;
}
}
5、repository类
public interface UserRepository extends JpaRepository<User, Integer> {
User findById(int id);
}
6、controller类
- 通过在控制器类上增加@Api 注解,可以给控制器增加描述和标签信息。
- 通过在接口方法上增加 @ApiOperation 注解来展开对接口的描述。
@RestController
@RequestMapping("/user")
@Api(tags = "用户操作接口", description = "提供用户相关的 Rest API")
public class UserController {
@Autowired
UserRepository userRepository;
@ApiOperation(value = "获取用户详细信息", notes = "根据用户的id来获取用户详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "query", dataType = "Integer")
@GetMapping(value = "/findById")
public User findById(@RequestParam(value = "id") int id) {
User user = userRepository.findById(id);
return user;
}
@ApiOperation(value = "获取用户列表", notes = "获取用户列表")
@GetMapping(value = "/getUserList")
public List getUserList() {
return userRepository.findAll();
}
@ApiOperation(value = "保存用户", notes = "保存用户")
@PostMapping(value = "/saveUser")
public String saveUser(@RequestBody @ApiParam(name = "用户对象", value = "传入json格式", required = true) User user) {
userRepository.save(user);
return "success!";
}
@ApiOperation(value = "修改用户", notes = "修改用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "主键id", required = true, paramType = "query", dataType = "Integer"),
@ApiImplicitParam(name = "username", value = "用户名称", required = true, paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "password", value = "用户密码", required = true, paramType = "query", dataType = "String")
})
@GetMapping(value = "/updateUser")
public String updateUser(@RequestParam(value = "id") int id, @RequestParam(value = "username") String username,
@RequestParam(value = "password") String password) {
User user = new User(id, username, password);
userRepository.save(user);
return "success!";
}
@ApiOperation(value = "删除用户", notes = "根据用户的id来删除用户")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "query", dataType = "Integer")
@DeleteMapping(value = "/deleteUserById")
public String deleteUserById(@RequestParam(value = "id") int id) {
User user = userRepository.findById(id);
userRepository.delete(user);
return "success!";
}
}
7、访问验证
image.png8、高级配置
接口过滤
有些时候我们并不是希望所有的 Rest API 都呈现在文档上,这种情况下 Swagger2 提供给我们了两种方式配置,一种是基于 @ApiIgnore 注解,另一种是在 Docket 上增加筛选。
- @ApiIgnore 注解。
如果想在文档中屏蔽掉删除用户的接口(user/delete),那么只需要在删除用户的方法上加上 @ApiIgnore 即可。 - 在 Docket 上增加筛选。
Docket 类提供了 apis() 和 paths()两个方法来帮助我们在不同级别上过滤接口:
apis():这种方式我们可以通过指定包名的方式,让 Swagger 只去某些包下面扫描。
paths():这种方式可以通过筛选 API 的 url 来进行过滤。
自定义响应消息
Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息,但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息,假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息,我们只需要在 Swagger2Config.java 类中的 Docket Bean 下添加如下内容:
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, newArrayList(
new ResponseMessageBuilder()
.code(500)
.message("服务器发生异常")
.responseModel(new ModelRef("Error"))
.build(),
new ResponseMessageBuilder()
.code(403)
.message("资源不可用")
.build()
));
自定义响应消息
9、Swagger UI 的使用
接口查看
SwaggerUI 会以列表的方式展示所有扫描到的接口,初始状态是收缩的,我们只需要点击展开就好,而且会在左边标识接口的请求方式(GET、POST、PUT、DELETE 等等)。 接口查看接口调用
- 点击接口展开后页面右上角的 Try it out 按钮。 image.png
- SwaggerUI 会给我们自动填充请求参数的数据结构,我们需要做的只是点击 Execute 即可发起调用。 image.png
Model
SwaggerUI 会通过我们在实体上使用的 @ApiModel 注解以及@ApiModelProperty 注解来自动补充实体以及其属性的描述和备注。 model10、相关注解说明
Controller 相关注解
- @Api: 可设置对控制器的描述。
注解属性 | 类型 | 描述 |
---|---|---|
tags | String[] | 控制器标签。 |
description | String | 控制器描述(该字段被申明为过期)。 |
接口相关注解
- @ApiOperation: 可设置对接口的描述。
注解属性 | 类型 | 描述 |
---|---|---|
value | String | 接口说明。 |
notes | String | 接口发布说明。 |
tags | Stirng[] | 标签。 |
response | Class<?> | 接口返回类型。 |
httpMethod | String | 接口请求方式。 |
- @ApiIgnore: Swagger 文档不会显示拥有该注解的接口。
- @ApiImplicitParams: 用于描述接口的非对象参数集。
- @ApiImplicitParam: 用于描述接口的非对象参数,一般与 @ApiImplicitParams 组合使用。
注解属性 | 描述 |
---|---|
paramType | 查询参数类型,实际上就是参数放在那里。取值: path:以地址的形式提交数据,根据 id 查询用户的接口就是这种形式传参。 query:Query string 的方式传参。 header:以流的形式提交。 form:以 Form 表单的形式提交。 |
dataType | 参数的数据类型。取值: Long String |
name | 参数名字。 |
value | 参数意义的描述。 |
required | 是否必填。取值: true:必填参数。 false:非必填参数。 |
Model 相关注解
- @ApiModel: 可设置接口相关实体的描述。
- @ApiModelProperty: 可设置实体属性的相关描述。
注解属性 | 类型 | 描述 |
---|---|---|
value | String | 字段说明。 |
name | String | 重写字段名称。 |
dataType | Stirng | 重写字段类型。 |
required | boolean | 是否必填。 |
example | Stirng | 举例说明。 |
hidden | boolean | 是否在文档中隐藏该字段。 |
allowEmptyValue | boolean | 是否允许为空。 |
allowableValues | String | 该字段允许的值,当我们 API 的某个参数为枚举类型时,使用这个属性就可以清楚地告诉 API 使用者该参数所能允许传入的值。 |