Swagger使用
Swagger
1.简介
- 了解Swagger的作用和概念
- 了解前后端分离
- 在springboot中集成Swagger
前后端分离
- vue+springboot
- 前端---前端控制层、视图层
- 后端---后端控制层、服务层、数据层
- 前后端通过API进行交互
产生的问题
- 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
解决方法
- 首先指定了schema[计划的提纲],实时更新API文档,降低集成的风险
- 早些年使用word文档
- 前后端分离时
- 前端测试后端接口:postman
- 后端提供接口,需要实时更新最新的消息
swagger诞生
- 号称世界上最流行的Api框架
- Restful Api 文档在线自动生成器
- 直接运行,在线测试API
- 支持多种语言 (如:Java,PHP等)
- 官网:https://swagger.io/
2.swagger的使用
SpringBoot集成Swagger => springfox,两个jar包
- Springfox-swagger2
- swagger-springmvc
使用步骤
-
新建一个springboot项目
-
导入依赖
<!--Swagger2--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!--swagger2-ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> -
编写controller,测试运行成功
-
要使用Swagger,我们需要编写一个配置类-SwaggerConfig来配置 Swagger
package com.mybatisplus.ant.config; import org.springframework.context.annotation.Configuration; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 //开启swagger2 public class SwaggerConfig { } -
访问测试:http://localhost:8080/swagger-ui.html ,可以看到swagger的界面;
3.Swagger的配置
-
通过配置Docket实例来配置Swaggger
@Bean //配置docket以配置Swagger具体参数 public Docket docket() { return new Docket(DocumentationType.SWAGGER_2); } -
通过apiInfo()属性配置文档信息
//配置swagger的信息————————》apiInfo public ApiInfo apiInfo(){ Contact contact = new Contact("清歌", "www.baidu.com", "353717996@qq.com"); //作者信息 return new ApiInfo( "清歌的API接口", //标题 "前后端分离API管理", //描述 "1.1", //版本 "", //地址 contact, "Apacher2.5", "", new ArrayList() ); } -
Docket 实例关联上 apiInfo()
@Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()); } -
重启项目,访问测试 http://localhost:8080/swagger-ui.html 看下效果;
4.配置扫描的接口
@Bean
public Docket docket(Environment environment) {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
//RequestHandlerSelectors 配置要扫描接口的方式
//basePackage 指定要扫描的包 basePackage("com.mabatis")
//any 扫描所有的
//none 全部不扫描
//withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象
//.withMethodAnnotation 扫描方法上的注解
.apis(RequestHandlerSelectors.basePackage("com.mabatis.ant.controller"))
//过滤什么路径
//.paths(PathSelectors.ant("/com/mabatis/**"))
.build();
}
5.配置Swagger开关
-
通过enable()方法配置是否启用swagger,如果是false,swagger将不能在浏览器中访问了
@Bean public Docket docket(Environment environment) { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问 .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 .apis(RequestHandlerSelectors.basePackage("com.mabatis.ant.controller")) .build(); } -
动态配置当项目处于dev环境时显示swagger,处于prod时不显示
@Bean public Docket docket(Environment environment) { // 设置要显示swagger的环境 Profiles profiles = Profiles.of("dev"); // 判断当前是否处于该环境 // 通过 enable() 接收此参数判断是否要显示 boolean flag = environment.acceptsProfiles(profiles); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(flag) //配置是否启用Swagger,如果是false,在浏览器将无法访问 .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 .apis(RequestHandlerSelectors.basePackage("com.mabatis.ant.controller")) .build(); } -
测试效果
6.配置API分组
-
如果没有配置分组,默认是default。通过groupName()方法即可配置分组:
@Bean public Docket docket(Environment environment) { return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) .groupName("清歌") // 配置分组 } -
重启测试
-
配置多个分组
@Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group1"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group2"); } @Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group3"); } -
重启测试
7.实体配置
-
新建实体类
@Data @EqualsAndHashCode(callSuper = false) @ApiModel(value="BookInfo对象", description="") public class BookInfo implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "图书id") @TableId(value = "book_id", type = IdType.AUTO) private Long bookId; @ApiModelProperty(value = "书名") private String name; @ApiModelProperty(value = "作者") private String author; @ApiModelProperty(value = "出版社") private String publish; @ApiModelProperty(value = "ISBN") @TableField("ISBN") private String isbn; @ApiModelProperty(value = "简介") private String introduction; @ApiModelProperty(value = "语言") private String language; @ApiModelProperty(value = "价格") private BigDecimal price; @ApiModelProperty(value = "出版日期") private Date pubdate; @ApiModelProperty(value = "分类号") private Integer classId; @ApiModelProperty(value = "书架号") private Integer pressmark; @ApiModelProperty(value = "状态") private Integer state; @ApiModelProperty(value = "逻辑删除") @TableLogic private Integer deleted; @ApiModelProperty(value = "乐观锁") @Version private Integer version; @ApiModelProperty(value = "创建时间") @TableField(fill = FieldFill.INSERT) private Date createTime; @ApiModelProperty(value = "修改时间") @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; } -
只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中:
@ApiOperation("书籍信息") @PostMapping("/books") public BookInfo bookInfo(){ return new BookInfo(); } -
测试效果

注:并不是因为@ApiModel这个注解让实体显示在这里了,而是只要出现在接口方法的返回值上的实体都会显示在这里,而@ApiModel和@ApiModelProperty这两个注解只是为实体添加注释的。
@ApiModel为类添加注释
@ApiModelProperty为类属性添加注释
Swagger的所有注解定义在io.swagger.annotations包下
下面列一些经常用到的,未列举出来的可以另行查阅说明:


浙公网安备 33010602011771号