SpringBoot集成Swagger
Swagger学习目标:
- 了解Swagger的概念及作用
- 掌握在项目中集成Swagger自动生成API文档
1.Swagger简介
前后端分类
- 前端----->前端控制层、视图层
- 后端----->后端控制层、服务层、数据访问层
- 前后端通过API进行交互
- 前后端相对独立且松耦合
产生的问题
- 前后端集成,前端或者后端无法做到“及时协商,尽早解决”,最终导致问题集中爆发
解决方案
- 首先定义schema【计划的提纲】,并实时跟踪最新的API,降低集成风险、
Swagger
- 号称世界上最流行的API框架
- Restful API 文档在线自动生成器 ======>API文档与API定义同步更新
- 直接运行,在线测试API
- 支持多种语言(如:Java,PHP)
- 官网:https://swagger.io/
2.SpringBoot集成
SpringBoot集成Swagger=====>springfox,两个jar包
- Springfox-swagger2
- swagger-springmvc
使用Swagger
要求jdk1.8+否则Swagger2无法运行
步骤:
1.新建一个springboot项目
2.添加Maven依赖
1 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> 2 <dependency> 3 <groupId>io.springfox</groupId> 4 <artifactId>springfox-swagger2</artifactId> 5 <version>2.9.2</version> 6 </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger- ui --> 7 <dependency> 8 <groupId>io.springfox</groupId> 9 <artifactId>springfox-swagger-ui</artifactId> 10 <version>2.9.2</version> 11 </dependency>
3.编写HelloController,测试确保运行成功
1 @RestController 2 public class HelloController { 3 @RequestMapping("/hello") 4 public String hello(){ 5 return "helloworld"; 6 } 7 }
4.要使用Swagger,我们需要编写一个配置类SwaggerConfig来配置Swagger
1 @Configuration //配置类 2 @EnableSwagger2 //开启Swagger2的自动配置 3 public class SwaggerConfig { 4 }
5.测试访问:http://localhost:8080/swagger-ui.html#/,可以看到Swagger的界面

3.配置Swagger
1.Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swagger。
1 @Bean 2 public Docket docket(){ 3 return new Docket(DocumentationType.SWAGGER_2); 4 }
2.通过apiInfp()属性配置文档信息
1 private ApiInfo apiInfo(){ 2 Contact contact = new Contact("dz", "https://www.cnblogs.com/lxzlovewyq/", "942142624@qq.com"); 3 return new ApiInfo( 4 "dz的SwaggerAPI文档", //标题 5 "我要学习", //描述 6 "1.0", //版本 7 "https://www.cnblogs.com/lxzlovewyq/", //组织连接 8 contact, //联系人信息 9 "Apache 2.0", //许可 10 "http://www.apache.org/licenses/LICENSE-2.0", //许可连接 11 new ArrayList()); //扩展 12 }
3.Docket实例关联apiInfo()
1 @Bean 2 public Docket docket(){ 3 return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()); 4 }
4.重启项目,访问测试:http://localhost:8080/swagger-ui.html#/ 查看效果

4.配置扫描接口
1.构建Docket时通过select()方法配置怎么扫描接
1 @Bean 2 public Docket docket(){ 3 return new Docket(DocumentationType.SWAGGER_2) 4 .apiInfo(apiInfo()) 5 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 6 .select() 7 //any() 扫描所有,项目中的所有接口都会被扫描到 8 //none() 不扫描接口 9 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller")) 10 .build(); 11 }
2.重启项目测试,由于我们配置,根据包的路径扫描接口,所以我们只能看到一个类

3.除了通过包路径配置扫描接口外,还可以通过配置其他方式扫描接口,这里注解一下所有的配置方式
1 any() // 扫描所有,项目中的所有接口都会被扫描到 2 none() // 不扫描接口 3 // 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求 4 withMethodAnnotation(final Class<? extends Annotation> annotation) 5 // 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有 controller注解的类中的接口 6 withClassAnnotation(final Class<? extends Annotation> annotation) 7 basePackage(final String basePackage) // 根据包路径扫描接口
4.除此之外,我们还可以配置接口扫描过滤:
1 @Bean 2 public Docket docket(){ 3 return new Docket(DocumentationType.SWAGGER_2) 4 .apiInfo(apiInfo()) 5 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 6 .select() 7 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller")) 8 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口 9 .paths(PathSelectors.ant("/dz/**")) 10 .build(); 11 }
5.这里可选值还有
1 any() // 任何请求都扫描 2 none() // 任何请求都不扫描 3 regex(final String pathRegex) // 通过正则表达式控制 4 ant(final String antPattern) // 通过ant()控制
5.配置开关Swagger
1.通过enable()方法配置是否启动swagger,如果是false,swagger将不能再浏览器中访问
1 @Bean 2 public Docket docket(){ 3 return new Docket(DocumentationType.SWAGGER_2) 4 .apiInfo(apiInfo()) 5 .enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问 6 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 7 .select() 8 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller")) 9 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口 10 .paths(PathSelectors.ant("/dz/**")) 11 .build(); 12 }

2.如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示?
1 @Bean 2 public Docket docket(Environment environment){ 3 //设置要显示swagger的环境 4 Profiles flag = Profiles.of("dev", "test"); 5 //判断当前是否处于该环境 6 //通过enable()接收此参数判断是否要显示 7 boolean b = environment.acceptsProfiles(flag); 8 return new Docket(DocumentationType.SWAGGER_2) 9 .apiInfo(apiInfo()) 10 .enable(b) 11 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 12 .select() 13 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller")) 14 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口 15 .paths(PathSelectors.ant("/dz/**")) 16 .build(); 17 }
3.添加dev和test环境配置
application.properties
1 spring.profiles.active=dev
application-dev.properties
1 server.port=8081
application-dev.properties
1 server.port=8082
4.访问网址:http://localhost:8081/swagger-ui.html#/

6.配置API分组
1.如果没有配置分组,默认是default.通过groupName()方法即可配置分组
1 @Bean 2 public Docket docket(Environment environment){ 3 //设置要显示swagger的环境 4 Profiles flag = Profiles.of("dev", "test"); 5 //判断当前是否处于该环境 6 //通过enable()接收此参数判断是否要显示 7 boolean b = environment.acceptsProfiles(flag); 8 return new Docket(DocumentationType.SWAGGER_2) 9 .apiInfo(apiInfo()) 10 .groupName("hello")//配置分组 11 .enable(b) 12 //.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口 13 .select() 14 .apis(RequestHandlerSelectors.basePackage("com.dz.swagger.controller")) 15 //配置如何通过path过滤,这里只扫描请求以/kuang开头的接口 16 .paths(PathSelectors.ant("/dz/**")) 17 .build(); 18 }
2.重启项目查看分组

3.如何配置多个分组?
配置多个分组只需要配置多个docket即可
1 @Bean 2 public Docket docket1(){ 3 return new Docket(DocumentationType.SWAGGER_2).groupName("group1"); 4 } 5 @Bean 6 public Docket docket2(){ 7 return new Docket(DocumentationType.SWAGGER_2).groupName("group2"); 8 } 9 @Bean 10 public Docket docket3(){ 11 return new Docket(DocumentationType.SWAGGER_2).groupName("group3"); 12 }
4.重启项目查看

7.实体配置
1.新建一个实体类
1 @ApiModel("用户实体") 2 public class User { 3 @ApiModelProperty("用户名") 4 public String username; 5 @ApiModelProperty("密码") 6 public String password; 7 }
2.只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中 controller
1 @PostMapping("/getUser") 2 public User getUser(){ 3 return new User(); 4 }
3.重启查看测试

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

我们给请求的接口配置一些注解
1 @ApiOperation("dz的接口") 2 @PostMapping("/dz") 3 @ResponseBody 4 public String dz(@ApiParam("这个名字会被返回") String username){ 5 return username; 6 }

这样的话,可以给一些比较难理解的属性或者接口,增加一些配置信息,让人更容易阅读
相较于传统的Postman或者Curl方式测试接口,使用Swagger简直就是傻瓜式操作,不需要额外说明文档(写的好本身就是文档)而且更不容易出错,只需要录入数据然后点击Execute,如果在配合自动化框架,可以说基本就不需要人为操作了
Swagger是一个优秀的工具,现在国内已经有很多的中小型互联网公司都在使用它,相较于传统的药先出word接口文档在测试的方式,显然这样也更符合现在的快速迭代开发行情。
在正式环境要记得关闭Swagger,一来出于安全考虑二来可以节省运行时内存。
9.其他皮肤
我们可以导入不同的包实现不同的皮肤定义
1.默认的 访问地址:http://localhost:8080/swagger-ui.html
1 <dependency> 2 <groupId>io.springfox</groupId> 3 <artifactId>springfox-swagger-ui</artifactId> 4 <version>2.9.2</version> 5 </dependency>
2.bootstrap-ui 访问地址:http://localhost:8080/doc.html
1 <dependency> 2 <groupId>com.github.xiaoymin</groupId> 3 <artifactId>swagger-bootstrap-ui</artifactId> 4 <version>1.9.1</version> 5 </dependency>
3.Layui-ui 访问地址:http://localhost:8080/docs.html
1 <dependency> 2 <groupId>com.github.caspar-chen</groupId> 3 <artifactId>swagger-ui-layer</artifactId> 4 <version>1.1.3</version> 5 </dependency>
4.mg-ui 访问地址:http://localhost:8080/document.html
1 <dependency> 2 <groupId>com.zyplayer</groupId> 3 <artifactId>swagger-mg-ui</artifactId> 4 <version>1.0.6</version> 5 </dependency>
浙公网安备 33010602011771号