1.Swager简介
- 号称世界上最流行的Api框架;
- RestFul Api 文档在线自动生成工具=>Api文档与API定义同步更新
- 直接运行,可以在线测试API接口
- 支持多种语言;(java、PHP…)
在项目中使用Swagger需要Springbox;
- swagger2
- ui
2.使用Swagger
-
创建一个Springboot项目(添加web依赖)
-
引入相关的jar包
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
-
编写Controller类测试项目是否能够运行
-
配置swagger===>>>Config
@Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { }
-
访问:http://localhost:8080/swagger-ui.html,进入swagger首页
-
配置Swagger的属性
package com.ddf.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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 java.util.ArrayList; @Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { //配置了swagger的Docket的bean实例 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()); } //配置Swagger信息=apiInfo //通过自己定义的属性,把原来的Swagger配置的页面信息给覆盖了 public ApiInfo apiInfo(){ //作者信息 Contact contact = new Contact("小火鸡","http://blog.ddf.com/","814655997@qq.com"); return new ApiInfo( "SwaggerAPI的文档", "这是个好东西", "v1.0", "http://blog.ddf.com/", contact, "Apache 2.0", "http://www.apche.org/licenses/LICENSE-2.0", new ArrayList<>() ); } }
可以看出,我们可以自己配置参数覆盖Swagger配置的信息
通过访问的swagger_ui.html页面,我们可以找到他对应的jar包下面有这么一个html
页面;
-
配置Swagger扫描接口
//配置了swagger的Docket的bean实例 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //RequestHandlerSelectors,配置要扫描的接口 //basePackage:指定要扫描的包 //any():扫描全部 //none():不扫描 //withClassAnnotation:扫描类上的注解 .apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController")) //paths():过滤什么路径 .paths(PathSelectors.ant("/ddf/**")) .build(); }
-
配置是否启动Swagger
//配置了swagger的Docket的bean实例 //enable表示是否启动Swagger,如果为false则不启动Swagger @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false) .select() //RequestHandlerSelectors,配置要扫描的接口 //basePackage:指定要扫描的包 //any():扫描全部 //none():不扫描 //withClassAnnotation:扫描类上的注解 .apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController")) //paths():过滤什么路径 .paths(PathSelectors.ant("/ddf/**")) .build(); }
思考题:只希望我的Swagger在生产环境中使用,在发布的时候不使用?(如何解决)
- 判断是否是生产环境 flag =false
- 然后注入enable(flag)这个值
1.首先配置多个配置文件(dev端口生产环境使用,pro发布的时候使用),通过设置的值判断项目的端口环境
dev访问路径:http://localhost:8081/swagger-ui.html#/
pro访问路径:http://localhost:8082/swagger-ui.html#/
2.获取要使用的Swagger,如果
//配置了swagger的Docket的bean实例
//enable表示是否启动Swagger,如果为false则不启动Swagger
@Bean
public Docket docket(Environment environment){
//设置要显示的Swagger环境
Profiles profiles = Profiles.of("dev","test");
//获取项目的环境:
//通过environment.acceptsProfiles判断是否处在自己设定的环境当中
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)
.select()
//RequestHandlerSelectors,配置要扫描的接口
//basePackage:指定要扫描的包
//any():扫描全部
//none():不扫描
//withClassAnnotation:扫描类上的注解
.apis(RequestHandlerSelectors.basePackage("com.ddf.controller.MyController"))
//paths():过滤什么路径
.paths(PathSelectors.ant("/ddf/**"))
.build();
}
如果flag为false:就不使用Swagger
-
配置多个分组;多个Docket实例即可
@Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("A"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("B"); }@Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("C"); }
效果如下:
-
实体类配置
-
创建一个实体类:User
@ApiModel("用户实体类") //给实体类加了文档注释 public class User { @ApiModelProperty("用户名") //给属性加了文档注释 public String userName; @ApiModelProperty("密码") public String password; }
运行效果如下:
-
Controller类:
package com.ddf.controller; import com.ddf.pojo.User; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @GetMapping("/index") public String index(){ return "index"; } //只用我们的接口中,返回的值中存在实体类,他就会被扫描到swagger中 @PostMapping("/user") public User user(){ return new User(); } //ApiOperation接口,他不是放在类上面的,是放在方法上的 @ApiOperation("Hello控制类") @GetMapping("/hello2") public String hello2(@ApiParam("用户名") String username){ return "hello2"+ username; } }
-
-
总结:
- 我们可以通过swagger给一些比较难理解的属性或者接口添加注解信息
- 接口文档实时更新
- 可以在线测试