目标
- 前后端分离概念:API接口交互
- springBoot集成Swagger
产生的一个问题 前后集成联调时,可能无法做到及时协商解决,产生不必要的争论
*解决:实时更新API文档,降低集成风险-----------POSTMAN(一个早期的接口测试工具)
解决 Swagger,API框架,Restful风格的API文档在线自动生成工具
1.SpringBoot集成Swagger
- 依赖导入
<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>
- Swagger配置
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
}
- 访问SwaggerUI
错误404
原因:swagger-ui.html相关的所有前端静态文件都在springfox-swagger-ui-2.4.0.jar里面。
SpringBoot自动配置本身并不会把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面,所以我们要添加映射
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
2.配置Swagger页面信息
Swagger的bean实例Docker
两种方式:new ApiInfo和new ApiInfoBuilder()
我的配置:`
@Bean
public Docket docket() {
//自己配置页面的一些信息
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
Contact contact=new Contact("张熙","无","邮箱*********");
//构造函数传参
//ApiInfo(String title, String description,
// String version, String termsOfServiceUrl,
// Contact contact, String license,
// String licenseUrl, Collection< VendorExtension > vendorExtensions) {
return new ApiInfo("康熙的SwaggerAPI案例","对知识保持一颗敬畏之心"
,"v1.0","https://mp.csdn.net/console/home",contact,"apach2.0",
"www.baidu.com",new ArrayList());
}
3.Swagger配置扫描接口
@Bean
public Docket docket() {
//自己配置页面的一些信息
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.select().apis(RequestHandlerSelectors.basePackage("com.zx.swagger.controller"))//RequestHandlerSelectors指定扫描的方式
.paths(PathSelectors.ant("/zx/**"))//过滤,只扫描带有zx的请求
.build();
}
RequestHandlerSelectors下的几种扫描方法
- basePackage扫描指定包路径
- any扫描所有
- none一个也不扫
- withMethodAnnotation通过方法注解扫描,需传入注解的类
- withClassAnnotation通过class的注解扫描,需传入注解类
4.配置Swagger是否开启
Docket类下有一个boolean值enabled默认为true(开启)
(生产环境需要Swagger开启,而发布环境不需要)
public Docket(DocumentationType documentationType) {
this.apiInfo = ApiInfo.DEFAULT;
this.groupName = "default";
this.enabled = true;
this.genericsNamingStrategy = new DefaultGenericTypeNamingStrategy();
this.applyDefaultResponseMessages = true;
this.host = "";
this.pathMapping = Optional.absent();
this.apiSelector = ApiSelector.DEFAULT;
this.enableUrlTemplating = false;
this.vendorExtensions = Lists.newArrayList();
this.documentationType = documentationType;
}
设置为false就是不开启
**
5.配置分组名
**
Docket类下的groupName默认为default,可修改
配置多个组?
注入多个Docket,组名设置不同
6.实体类配置
6.1怎样才能让实体类被扫描到?
控制层接口方法返回值存在实体,该实体类就会被扫描到
@PostMapping("/getUser")
public User getUser()
{
return new User();//有User的返回,所以User类会被扫描到
}
6.2实体类上的辅助注解
@ApiModel加在实体类上
@ApiModelProperty加在字段上
@ApiOperation加在接口方法上
@ApiParam加在接口方法传入参数上
7.Swagger测试的便利
图形界面传参
结果如图