Spring-接口文档swagger2
1、swagger/knife4j 接口文档配置
knife4j是swagger的增强版本,更加的小巧、轻量,功能也是更加的完善,UI也更加的清晰;可以从swagger到knife4j无缝切换。
1.1 引入相关依赖
<!--接口文档的开发: knife4j是swagger的增强版本,更加的小巧、轻量,功能也是更加的完善,UI也更加的清晰;可以从swagger到knife4j无缝切换。-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
swagger接口文档访问地址:
http://192.168.0.145:9991/swagger-ui/index.html
knife4j接口文档的访问地址:
http://192.168.0.145:9991/doc.html
1.2 创建Swagger配置类
我这里的接口文档信息,是通过application.properties 中配置注入的,这样方便修改相关信息,而不同改变源码。
package cn.zhidasifang.common.config;
import com.sun.org.apache.xpath.internal.operations.Bool;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
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;
/**
* @author: AD_Liu
* @Description: 接口文档Swagger配置类
* @ClassName: SwaggerConfig
*/
@Component
@EnableSwagger2
public class SwaggerConfig {
@Value("${swagger.enable}")
private Boolean swaggerEnable;
@Value("${swagger.title}")
private String title;
@Value("${swagger.description}")
private String description;
@Value("${swagger.contact.name}")
private String name;
@Value("${swagger.contact.url}")
private String url;
@Value("${swagger.contact.email}")
private String email;
@Value("${swagger.version}")
private String version;
/**
* @return springfox.documentation.service.ApiInfo
* @Description:获取封装好的接口文档信息
* @Param []
*/
public ApiInfo getApiInfo() {
return new ApiInfoBuilder()
//设置标题
.title(title)
//描述
.description(description)
//作者信息
.contact(new Contact(name, url, email))
.termsOfServiceUrl(url)
//版本
.version(version)
.build();
}
/**
* @return springfox.documentation.spring.web.plugins.Docket
* @Description:定义接口文档的基本信息
* @Param []
*/
@Bean
public Docket configUi() {
return new Docket(DocumentationType.SWAGGER_2)
//统一前缀的配置?
//.pathMapping(url)
//定义是否开启 swagger。false关闭
.enable(swaggerEnable)
//创建api的基本信息
.apiInfo(getApiInfo())
//选择那些接口作为swagger的doc发布
.select()
//控制那些接口暴露给swagger
//.apis(RequestHandlerSelectors.any()) //所有暴露
//RequestHandlerSelectors.basePackage("com.demo.security.*") 指定包定位
//RequestHandlerSelectorswithMethodAnnotation(ApiOperation.class) 标记又 @ApiOperation注解 的接口暴露
//.apis(RequestHandlerSelectors.basePackage("cn.zhidasifang.camundaproject.SalaryProcess.controller"))
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//.paths(PathSelectors.regex("/error").negate())
.paths(PathSelectors.any())
.build();
}
}
- application.properties 文件中的数据
#接口文档相关配置信息
swagger.enable = true
swagger.title = 流程控制相关_接口文档
swagger.description = 流程中相关接口文档,接口分类:流程模快定义、流程任务处理、表单模快等
swagger.contact.name = Liu
swagger.contact.url = 192.168.0.145:9991
swagger.contact.email = 1299637404@qq.com
swagger.version = 1.0
1.3 application.yml 配置文件中的相关配置信息
高版本的SpringBoot 在整合 Swagger 时,还需要在yml 文件中配置增加路径配置,这里需要在spring.mvc.pathmatch.matching-strategy:项中配置 匹配路径 ant_path_matcher。
否则就会在项目启动时报错!
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher #swagger配置
#Swagger配置
swagger:
enable: true
application-name: CamundaProject
application-version: 1.0
application-description: client
knife4j:
enable: true
2、swagger常用注解
2.1 @Api 注解
用在请求的类上,表示对类的说明:常用属性介绍:
-
tags=“说明该类的作用,可以在UI界面上看到的注解”
-
value=“该参数没什么意义,在UI界面上也看到,所以不需要配置”
@Api的其它属性配置
属性名称 作用 value url的路径值 tags 如果设置这个值、value的值会被覆盖 description 对api资源的描述 basePath 基本路径 position 如果配置多个Api 想改变显示的顺序位置 produces 如, “application/json, application/xml” consumes 如, “application/json, application/xml” protocols 协议类型,如: http, https, ws, wss authorizations 高级特性认证时配置 hidden 配置为true ,将在文档中隐藏
ApiSupport( order =1/2/3 ) 文档中接口类排序顺序注解
2.2 方法/方法参数描述注解
主要涉及到三个注解分别是:
2.2.1 @ApiOperation注解
@ApiOperation:用在请求的方法上,说明方法的用途、作用
属性 value=“说明方法的用途、作用”
属性 notes=“方法的备注说明”
2.2.2 @ApiImplicitParams注解
@ApiImplicitParams:方法参数的说明
@ApiImplicitParams注解需要包含一个或者多个 @ApiImplicitParam注解。格式如下
@ApiImplicitParams({
@ApiImplicitParam(name = "sysForm",value ="ApiImplicitParam表单定义实体类参数1111")
})
2.2.3 @ApiImplicitParam注解
@ApiImplicitParam:用于指定单个参数的说明
@ApiImplicitParam注解,可以单独使用在方法上,能说明单个参数的相关信息。也可包含在@ApiImplicitParams注解中使用。对应的属性有如下所示:
属性名称 | 作用 |
---|---|
name | 参数名 |
value | 参数的汉字说明、解释 |
required | 参数是否必须传 |
paramType | 参数放在哪个地方 |
dataType | 参数类型,默认String,其它值dataType=“Integer” |
defaultValue | 参数的默认值 |
其中 paramType 属性对应用下面几种类型:
- header --> 请求参数的获取:@RequestHeader
- query --> 请求参数的获取:@RequestParam
- path(用于restful接口)–> 请求参数的获取:@PathVariable
- body(不常用)
- form(不常用)
@ApiOperationSupport( order=1/2/3 ) 同一类中的接口排列顺序
2.3 接口响应状态的描述
-
@ApiResponses : 方法返回值的说明 。
@ApiResponses:响应状态的说明。是个数组,可包含多个 @ApiResponse
-
@ApiResponse:用于指定单个参数的说明。
属性值:
- code:数字,例如400
- message:信息,例如"请求参数没填好"
- response:抛出异常的类
2.4 实体类对象描述注解
主要包含两个注解分别是
-
@ApiModel :经常用于请求的入参对象 和 响应返回值对象的描述,在接口方法上使用
属性描述:
- 属性value : 实体类名称
- 属性notes :实体类描述信息
-
@ApiModelProperty :用于每个属性上面,说明属生的含义。
3、示例展示
-
Controller层接口文档注解演示
/** * @author AD * @Description: xxxx * @ClassName: FormInfoResource * */ @Controller @RequestMapping("/form/formInfo") @Api(tags = "自定义表单管理接口") public class FormController { @Autowired private IFormInfoService formInfoService; @PostMapping("/test") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "sysForm",value ="ApiImplicitParam表单定义实体类参数1111") }) public String testForm(@RequestBody SysForm sysForm){ System.out.println("sysForm = " + sysForm); formInfoService.saverFormInfo(sysForm); return "测试多项目模快成!"; } }
-
实体类接口文档注解演示
package cn.zhidasifang.formmanagement.model; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; import springfox.documentation.spring.web.json.Json; import java.io.Serializable; import java.util.List; import java.util.Map; /** * 流程表单对象 sys_task_form * @author AD * @author Tony */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) /**支持链式编程*/ @ApiModel(value = "自定义表单实体类",description = "自定义表单对应的实体类,实体类出现在自定义表单创建时/前端解析自定义表单类型数据时。") public class SysForm implements Serializable { /** 表单主键 */ @ApiModelProperty(value = "定义表单主键(String)",required = true) private String id; /** 表单类型 */ @ApiModelProperty(name = "",value ="定义表单的格式类型(String)",required = true) private String type; /** 表单名称 */ @ApiModelProperty(value = "表单定义时所代表的单据类型(String)",required = true) private String title; /** 表单内容:json格式的数据 */ @ApiModelProperty(value = "表单定义体:表单中的主体数据类型(List<Map<Object,Object>>)",required = true) private List<Map<Object,Object>> body; /** 表单pullRefresh */ @ApiModelProperty(value ="pullRefresh(Map<Object,Object>)",required = true) private Map<Object,Object> pullRefresh; /** 表单regions */ @ApiModelProperty(value = "regions(List<Object>)",required = true) private List<Object> regions; @Override public String toString() { return "SysForm{" + "id='" + id + '\'' + ", type='" + type + '\'' + ", title='" + title + '\'' + ", body='" + body + '\'' + ", pullRefresh='" + pullRefresh + '\'' + ", regions='" + regions + '\'' + '}'; } }
-
访问画面展示
Swagger接口文档访问展示:http://192.168.0.145:9991/swagger-ui/index.html
knife4j接口文档访问展示:http://192.168.0.145:9991/doc.html