通过Swagger系列可以快速生成API文档,但是这种API文档生成是需要在接口上添加注解等,这是一种侵入式方式;
本文主要介绍非侵入式的方式及集成Smart-doc案例
1. 前言
既然有了Swagger, 为何还会产生Smart-Doc这类工具?本质上是Swagger侵入性和依赖性
目前主流的技术文档工具存在什么问题:
侵入性强:需要编写大量的注解,代表工具有:swagger
强依赖性:如果项目不使用该工具,业务代码无法编译通过
代码解析能力弱,使用文档不齐全,主要代表为国内众多开源的相关工具
众多基于注释分析的哦你工具无法解析jar包里面的注释(sources jar),需要人工配置源码路径,无法满足DevOps构建场景
部分工具无法支持多模块复杂项目的代码分析
2. Smart-Doc介绍
smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写注释, smart-doc就能帮你生成一个简易明了的Markdown、HTML5、Postman Collection2.0+、OpenAPI 3.0+的文档。
2.1 特性
- 零注解、零学习成本、只需要写标准JAVA注释。
- 基于源代码接口定义自动推导,强大的返回结构推导。
- 支持Spring MVC、Spring Boot、Spring Boot Web Flux(controller书写方式)、Feign。
- 支持Callable、Future、CompletableFuture等异步接口返回的推导。
- 支持JavaBean上的JSR303参数校验规范,包括分组验证。
- 对JSON请求参数的接口能够自动生成模拟JSON参数。
- 对一些常用字段定义能够生成有效的模拟值。
- 支持生成JSON返回值示例。
- 支持从项目外部加载源代码来生成字段注释(包括标准规范发布的jar包)。
- 支持生成多种格式文档:Markdown、HTML5、Asciidoctor、Postman Collection、OpenAPI 3.0。 Up- 开放文档数据,
- 可自由实现接入文档管理系统。
- 支持导出错误码和定义在代码中的各种字典码到接口文档。
- 支持Maven、Gradle插件式轻松集成。
- 支持Apache Dubbo RPC接口文档生成。
- debug接口调试html5页面完全支持文件上传,下载(@download tag标记下载方法)测试。
3. 实现案例
从smart-doc 1.7.9开始官方提供了Maven插件,可以通过在项目中集成smart-doc的Maven插件,然后运行插件直接生成文档。 我们的案例基于smart-doc-maven-plugin,生成文档。示例参考官方配置文档而写。
3.1 添加maven插件
1 | <build> |
3.2 添加smart-doc配置文件
在上面的configFile
属性中的路径创建配置文件,输入以下内容:
1 | { |
3.3 运行测试
执行maven命令生成文档
1 | mvn -Dfile.encoding=UTF-8 smart-doc:html |
构建后的html如下:
也可以看到还自动提供了mock的数据,以及测试接口的按钮。还包含自定义的返回枚举类型等。
3.4 生成更多类型的文档
1 | 生成markdown |
4. 进一步理解
4.1 smart-doc 如何从注释拓展文档内容
smart-doc
是通过使用javadoc
文档注释来去除注解式的侵入,因此smart-doc
每增加一个功能首先都是去考虑javadoc
生的tag
下面对smart-doc
使用的一些javadoc
的注释tag
做介绍:
tag名称 | 描述 |
---|---|
@param | 对于在Spring Boot接口层,对于简单类型的参数必须在使用@param时写上注释描述,对于Entity类型smart-doc则不会检查 |
@deprecated | 可以在注释中用于标记接口已经废弃,作用同@Deprecated注解 |
@apiNote | @apiNote是JAVA新增的文档tag,smart-doc使用@apiNote的注释作为方法的详细描述,因此可以使用@apiNote来写一段长注释。如果一个方法不写 @apiNote注释说明,smart-doc直接使用方法默认注释填充 |
另一方面,原生的tag是不够的,所以smart-doc
又通过自定义tag来支持更多的功能拓展
tag名称 | 描述 |
---|---|
@ignore | @ignore tag用于过滤请求参数对象上的某个字段,设置后smart-doc不输出改字段到请求参数列表中。关于响应字段忽略的请看【忽略响应字段】,如果@ignore加到方法上,则接口方法不会输出到文档。从1.8.4开始@ignore支持添加到Controller上进行忽略不想生成文档的接口类。@ignore也可以用于方法上忽略某个请求参数。 |
@required | 如果你没有使用JSR303参数验证规范实现的方式来标注字段,就可以使用@required去标注请求参数对象的字段,标注smart-doc在输出参数列表时会设置为true |
@mock | 从smart-doc 1.8.0开始,@mock tag用于在对象基本类型字段设置自定义文档展示值。设置值后smart-doc不再帮你生成随机值。方便可以通过smart-doc直接输出交付文档。 |
@dubbo | 从smart-doc 1.8.7开始,@dubbo tag用于在Dubbo的API接口类上添加让smart-doc可以扫描到Dubbo RPC的接口生成文档。 |
@restApi | 从smart-doc 1.8.8开始,@restApi tag用于支持smart-doc去扫描Spring Cloud Feign的定义接口生成文档。 |
@order | 从smart-doc 1.9.4开始,@order tag用于设置Controller接口或者API入口的自定义排序序号,@order 1就表示设置序号为1。 |
@ignoreResponseBodyAdvice | 从smart-doc 1.9.8开始,@ignoreResponseBodyAdvice tag用于忽略ResponseBodyAdvice设置的包装类。 |
@download | 从smart-doc 2.0.1开始,@download tag用于标注在Controller的文件下载方法上,生成debug页面时可实现文件下载测试。并且支持下载文件带请求头参数测试 |
@page | 从smart-doc 2.0.2开始,@page tag用于标注在Controller的方法上表示该方法用来渲染返回一个静态页面,生成debug页面时如果发起测试,测试页面会自动在浏览器开启新标签显示页面 |
@ignoreParams | 从smart-doc 2.1.0开始,@ignoreParams tag用于标注在Controller方法上忽略掉不想显示在文档中的参数,例如:@ignoreParams id name,多个参数名用空格隔开 |
@tag | @since 2.2.5, @tag用于将Controller方法分类, 可以将不同Contoller下的方法指定到多个分类下, 同时也可以直接指定Controller为一个分类或多个分类 |
4.2 smart-doc代码调试
在使用
smart-doc-maven-plugin
插件来构建生成API文档的过程中可能会出现一些错误问题,官方文档提供了调试方案
添加
smart-doc
依赖因为
smart-doc-maven-plugin
最终时使用smart-doc
来完成项目源码分析和文档生成的,通常情况下真正的调试代码是smart-doc
1
2
3
4
5
6<dependency>
<groupId>com.github.shalousun</groupId>
<artifactId>smart-doc</artifactId>
<version>[最新版本]</version>
<scope>test</scope>
</dependency>注意:使用
smart-doc
的版本最好和插件依赖的smart-doc
版本一致。
添加断点
Debug模式运行构建目标
提示:上面是通过插件作为入口调试smart-doc
的远啊,如果想调试插件本身的源码执行过程,则将插件的依赖添加到项目依赖中,如下:
1 | <dependency> |
然后通过上面的类似步骤调试smart-doc-maven-plugin
的源码