若依前后端分离版添加 knife4j (swagger 增强版)
前言
项目需要一个对外开放的接口文档,以便其他人对接联调。但若依前后端分离使用的是 swagger v3 版本的接口文档组件,生成的接口文档不仅需要登录状态,而且 Swagger UI 默认的界面确实不太理想:

虽然官方的修改器 Swagger Editor 可以将 http://localhost:1024/dev-api/v3/api-docs 文档的 JSON 格式转化为 html 客户端输出,但界面效果依旧不太理想。

之前的项目中有使用过 knife4j 的接口文档,看着整体还不错,并且,可以导出各种格式的离线文档。

接入 knife4j
通过阅读之前的文档 从 Mybatis-Plus 代码生成器(新)到 Swagger,到 springfox-swagger2,springfox-boot-starter,再到 Knife4j,熟悉了一下 swagger 到 knife4j 的流程。正常来说,直接使用
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>替换掉
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>就可以了,因为 knife4j v3.0.3 依赖里正好对应的是 springfox v3.0.0。但若依依赖中对 swagger-models 做了版本替换,备注里说的是,防止进入swagger页面报类型转换错误。所以,直接添加 knif4j 就可以了,不需要去除原来的 swagger3。
<!-- knife4j(swagger3增强版) -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>此时可以通过 ip+port+/doc.html 直接访问文档页面。
常用注解
knife4j 属于 swagger 的增强版,除了 swagger 的注解以外,还增加了一些新的注解功能,比如文档排序 @ApiSupport(order = 2) 、 @ApiOperationSupport(order = 1),此时如果不开启 knife4j 注解是无效的(虽然不会报错,但也不生效)。
# Knife4j配置
knife4j:
# 是否开启Knife4j(swagger 增强版)
enable: true
# 开启屏蔽文档资源
production: falseknife4j.production 默认为 false ,也就是不屏蔽文档资源,如果线上开启屏蔽之后,则访问 doc.html 会有文字提示:You do not have permission to access this page。
swagger 常用的注解就这么几个:
@Api(value = "指令", tags = {"指令接口"}, hidden = false)@ApiOperation("启动", hidden = false)@ApiModel(description = "通用请求")@ApiModelProperty(value = "设备编号", required = true)@ApiSupport(order = 1)@ApiIgnore
@Api 用于控制器,因为文档是以控制器作为请求分组的,如果只带一个字符串,默认传递值到 value。但不管是 swagger 还是 knife4j 的分组列表上显示都是 tags 值,所以需要优先设置 tags。tags 为 String 数组类型,在设置 tags 之后,如果其他控制器也添加了该 tags,其他分组列表里也会显示该 tags 下的所有请求。hidden 表示隐藏整个控制器请求,默认为 false,与下面的 @ApiIgnore 注解有相同的作用。
@ApiOperation 用于方法,默认 value 显示为请求名。@ApiOperation 也有 tags 属性,猜测跟控制器的 tags 使用方法基本一致。hidden 表示隐藏整个控制器请求,默认为 false,与下面的 @ApiIgnore 注解有相同的作用。
因为使用 body JSON 格式请求,所以在定义的请求 bean 中会用到 @ApiModel 和 @ApiModelProperty。
@ApiModel 用于请求模型,其类型元素 description 显示为 请求参数 中的 参数说明。
@ApiModelProperty 用户请求模型属性,默认 value 显示为属性名称,required 显示为 是否必须,但对于属性没有强制验证。
如果需要验证字段,可以在定义模型前面添加 @Validated,如:@RequestBody @Validated CommonReqVO commonReqVO,之后在模型属性上添加 @NotBlank(message = "xxx不能为空") 的校验规则(NotBlank)和返回信息。
排序的注解 @ApiSupport 用于控制器,@ApiOperationSupport 用于方法,默认是正序排序。但这个注解只对启用了 knife4j 的接口文档起作用,因为属于增强部分注解。
忽略的注解 @ApiIgnore 可以用于控制器和方法,添加之后整个控制器或者标注了的方法会隐藏不显示。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
海滨擎蟹
微信
支付宝