本文主要分享一个基于个人兴趣,旨在提高工作效率,开发了一个基于文档注释,接口文档生成工具,欢迎大佬指点。

源码以及使用demo地址 :传送门

1.前置介绍

1.1前世

现在大多数项目都走向了前后端分离,前后端并行开发,这就需要后端同学在开发前先写好接口文档。很多时候开发人员一般都会选择,自己手写文档,或者使用目前开源的API工具,包括现在比较火的swagger但劣势也不少

Swagger分析:
1).为生成规范的接口文档,需要添加各种各样的注解,代码侵入性太强
2).增加了人工成本,做了多余的事;
3).增加复杂度,代码越多复杂性越差;
4).需要遵守其特殊的规范;

图示示例:

1.2深思

问题:能不能根据参数类中的文档注释生成接口文档呢 ?作为程序员,代码不应该即是文档吗?
那我们现在的需求是什么呢 ?
1).代码侵入性小,配置简单 、层级结构清晰、可输出参数示例demo;
2).无需太复杂的功能,只要可以生成文档即可 ;
3).最好是支持转换成语雀,方便存档;

带着好奇心与兴趣开始考虑?如何获取文档注释?
遇到的最大难点就是:代码编译后会自动去除注释;
从编译后的代码里获取肯定是行不通的。思维转变,编译后取不到,那就从未编译的文件里获取。

1.3今生

根据文档注释生成接口文档工具,在空余时间研究并开发,已经基本完成分享使用。

主要用到的技术点

IO、反射、Freemarker模板引擎、Markdown语法

2.功能介绍

2.1主要功能

(1).读取文档注释

  • 读取参数类中属性文档注释;
  • 读取controller方法文档注释;
  • 读取接口类文档注释;

(2).支持复杂参数

  • 参数层级嵌套,继承父类;
  • 支持返回值,泛型格式输出(根据一些关键词 T、Object、、等判断的);

(3).统一网关类接口文档生成

  • 支持生成统一网关接口的文档,自定义@OpenApi注解的读取;

(4).根据注解获取请求类型

  • 支持根据接口注解获取请求类型,示例:@PostMapping;

(5).根据注解判断参数是否非空

  • 支持根据注解**[@NotBlank,@NotNull,@NotEmpty]**判断入参是否必填,返回参数默认非空

(6).根据注解判断参数长度

  • 支持根据注解**[@Max,@Min,@Size,@Length,@DecimalMax,@Range,@DecimalMin] **输出入参长度;

(7).生成JSON示例

  • 支持输出json格式参数Demo示例;
  • 支持根据类型以及名称模拟值;

(8).生成统一结构MD接口文档

  • 生成MD接口文档;
  • 支持拷贝到语雀平台,文档格式依然存在;

(9).文档参数类型转换

  • 支持参数驼峰转下划线转换 ;

(10).排序规则

  • 参数属性排序 > 以类中属性从上往下顺序排序;
  • 接口方法排序 > 以类中方法从上往下顺序排序;

2.2.优缺点

优点:
(1).代码非侵入性,无需添加一些无用的注解;
(2).无需引入依赖生成,减少与业务项目耦合度;
(3).可以自定义一些功能;
(4).早日实现代码即文档的期盼,减少人工编写接口文档的时间;

缺点:
(1).返回参数多级需要使用泛型;
(2).拷贝到语雀后样式兼容差强人意;

2.3.示例图

3.特殊规则

** 注:未按照如下规则,可能会导致无法生成完整文档或失败。**

3.1参数类文档注释匹配-特殊规则
(1).内部类支持不太完善;

3.2Controller接口方法类规则
(1).返回值支持自定义类,统一返回Response,需要加泛型,否则获取不到嵌套的返回值,示例:Response ;
(2).同一个controller类方法名称建议不相同,重名情况下可能会导致方法注释匹配错误问题 ;
(3).java.包下的返回值暂不支持 ;
(4).private方法会自动过滤 ;
(5).相同方法名,重载的方法,可能会出现注释匹配错误 ;

4.使用方式

  • 文档生成的是md文件支持Markdown语法
  • 目前支持两种使用方式
    方式一:外置工具方式
    方式二:依赖jar包+启动类方式
    两种方式功能一致,可选择性使用。推荐使用侵入性较小的外置工具方式。

4.1外置工具生成

注:外置工具生成,指的是无需引入工具jar包方式生成

4.1.1精简版使用示例

1).下载工具包

源码地址

注意:下载后解压路径,最好不要有中文路径

可执行jar解压后文件示例

文件介绍

  • ApiGeneratorConfig.xml > 当前配置文件
  • ApiGeneratorConfig_orgin.xml > 全配置文件
  • api-document-generate.jar > 生成工具Jar
  • start.bat > Win 系统下启动
  • start.command > ios 系统下启动

下载完工具后,可打开源码可执行jar目录下ApiGeneratorConfig.xml配置成相应的自己电脑的示例工程目录即可开始生成

2).配置ApiGeneratorConfig.XML

<?xml version="1.0" encoding="UTF-8" ?>
<config><!-- 生成类型 1-根据包地址生成,包下所有类的接口 2-自定义类生成 --><generateType value="1"/><!-- 项目下类扫描路径(绝对路径), 支持多个 , 一般是项目根路径 --><projectScanPaths><path value="/Users/xx/project/api-generate-demo"/></projectScanPaths><!-- 包文件夹地址(绝对路径,生成类型为1时必填) --><apiPackagePathvalue="/Users/xx/project/api-generate-demo/api-generate-web02/src/main/java/com/example/controller"/><!-- 类文件地址(绝对路径,生成类型为2时必填)--><apiClassPaths><path value=""/></apiClassPaths></config>

启动注意事项

  • 启动前需要配置好XML文件中的内容;
  • 配置文件获取路径默认是当前运行路径下名称为 ApiGeneratorConfig.xml;
  • 生成文件默认地址 :当前运行路径下 generate 文件夹下;

Win 系统下启动 双击 start.bat
ios 系统下启动 双击 start.command

4.1.2全功能配置指南

1).根据包地址生成

<?xml version="1.0" encoding="UTF-8" ?>
<config><!-- 生成类型 1-根据包地址生成,包下所有类的接口 2-自定义类生成 --><generateType value="1"/><!-- 项目下类扫描路径(绝对路径), 支持多个 --><projectScanPaths><path value="/Users/xx/project/api-generate-demo"/></projectScanPaths><!-- 包文件夹地址(绝对路径,生成类型为1时必填) --><apiPackagePathvalue="/Users/xx/project/api-generate-demo/api-generate-web02/src/main/java/com/example/controller"/></config>

2).根据类地址生成

<?xml version="1.0" encoding="UTF-8" ?>
<config><!-- 生成类型 1-根据包地址生成,包下所有类的接口 2-自定义类生成 --><generateType value="2"/><!-- 项目下类扫描路径(绝对路径), 支持多个 --><projectScanPaths><path value="/Users/xx/project/workproject/fshows-finance"/></projectScanPaths><!-- 类文件地址(绝对路径,生成类型为2时必填)--><apiClassPaths><path value="/Users/xx/project/workproject/fshows-finance/fshows-finance-openapi/src/main/java/com/fshows/finance/service/FeeCodeApiService.java"/><path value="/Users/xx/project/workproject/fshows-finance/fshows-finance-openapi/src/main/java/com/fshows/finance/service/PayableApiService.java"/></apiClassPaths>
</config>

3).统一网关类型接口配置

<!-- 开放接口注解类配置, annotationFieldName 默认 "method" -->
<gateWayField annotationName="com.fshows.finance.common.annotation.OpenApi" annotationFieldName="method"/>

4).根据参数名排除

<!-- 排除参数名配置(支持多个) -->
<apiExcludeParamNames><paramName value="nonce"/><paramName value="sourceType"/>
</apiExcludeParamNames>

5).根据参数全路径排除

  <!-- 排除参数全类名配置(支持多个) --><apiExcludeParamClassNames><paramClassName value="com.demo.param.UserLoginResult"/></apiExcludeParamClassNames>

6).Json示例生成开关

<!-- 是否生成 1-是,2-否 默认1 -->
<generateJsonFlag value="2"/>

7).参数类型转换

<!-- 参数类型 1-默认,2-驼峰转下划线 -->
<apiParamType value="2"/>

8).生成文件路径配置

注:生成文件默认名称,Api-generate-MMddHHmmss.md
默认路径是当前项目路径,路径可自定义

<!-- 生成文件地址(默认:当前目录) -->
<generateFilePath value="/Users/mengqiang/Desktop/api-generate-tool/finance/openapi"/>

9).项目请求地址根路径

<!-- 项目接口访问根路径 默认无 -->
<projectRootUrl value=""/>

10).自定义统一返回对象

注:一些接口中未包含统一返回对象,但是希望生成的文档包含此结构
参数含义依次为: 参数名, 参数类型, 参数描述, 是否作为父级
是否作为父级标识为是情况下将会,把原先的返回参数添加到该父级下

<!-- 自定义顶级返回对象属性 -->
<apiRootResField><field name="success" typeClassName="java.lang.Boolean" desc="请求是否成功" isParent="0"/><field name="data" typeClassName="java.lang.Object" desc="" isParent="1"/><field name="errorCode" typeClassName="java.lang.String" desc="错误码" isParent="0"/><field name="errorMsg" typeClassName="java.lang.String" desc="错误信息" isParent="0"/>
</apiRootResField>

11).接口头信息输出

针对接口文档存在统一头信息情况下使用,可以在每一个接口中添加头信息参数

<!-- 请求 contentType -->
<contentType value="application/x-www-form-urlencoded"/><!-- 头信息 -->
<apiHeaderField><field name="token" type="String" desc="当前登录用户token" isRequired="1"/>
</apiHeaderField>

5.文件查看

5.1.[推荐]打开工具

系统 工具名称 官网地址
Windows Typora https://www.typora.io/
IOS MacDown https://macdown.uranusjr.com/

Demo示例图:

4.2.2.文本形式查看

支持以文本形式打开文件,直接拷贝内容粘贴到语雀文档中


注:输出使用的是Markdown 语法,若拷贝到语雀粘贴时请点击进行转换,
建议采用工具打开后,再拷贝到羽雀,
使用文本格式拷贝到语雀后会被重新编译,内容会存在多余的空行。**

转换后示例:

6.附言

万物有痕,可能会有一些未考虑到场景或问题,欢迎大佬指点。

公众号
更多精彩内容、编程故事、心得分享,欢迎关注公众号

基于文档注释接口文档生成工具(代码0侵入附源码)相关推荐

  1. 【QT/C++】基于QT开发的一款A-SOUL元素的视频播放器(附源码)

    [QT/C++]基于QT开发的一款关于A-SOUL的视频播放器(附源码) 前言 一.软件使用说明 1.运行软件的界面如下 2.操作软件的步骤 二.软件设计说明 1.UI界面的设计 2.主代码中的部分函 ...

  2. 一文看尽深度学习中的20种卷积(附源码整理和论文解读)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引言 卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征 ...

  3. 2021-06-26一文看尽深度学习中的20种卷积(附源码整理和论文解读)

    卷积,是卷积神经网络中最重要的组件之一.不同的卷积结构有着不一样的功能,但本质上都是用于提取特征.比如,在传统图像处理中,人们通过设定不同的算子来提取诸如边缘.水平.垂直等固定的特征.而在卷积神经网络 ...

  4. 手把手!基于领域预训练和对比学习SimCSE的语义检索(附源码)

    之前看到有同学问,希望看一些偏实践,特别是带源码的那种,安排!今天就手把手带大家完成一个基于领域预训练和对比学习SimCSE的语义检索小系统. 所谓语义检索(也称基于向量的检索),是指检索系统不再拘泥 ...

  5. 基于SSM框架简易项目“书籍管理系统”,超详细讲解,附源码

    目录 我有话说: 1 项目简介 2 项目展示 2.1 首先创建数据库和表信息 2.2 预先准备操作 2.3 开始配置项目 2.4 开始web层 3 图片展示 4 附上源码文件(百度网盘): 我有话说: ...

  6. 基于Vue+Express+Mysql开发的手机端电影购票系统(附源码)

    基于Vue+Express+Mysql开发的手机端电影购票系统 基于手机的电影购票系统-Vue+Node 一个Vue+Express+Mysql的电影售票项目 项目完整源码下载 https://dow ...

  7. 非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】

    目录 使用说明 非对称加密 生成keystore文件 公钥私钥互相解密 获取fd-alias.keystore中的公钥私钥 使用生成公钥私钥进行解密 源码地址 使用说明 非对称加密 非对称加密算法主要 ...

  8. 基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

    目录 一.合成孔径雷达成像 二.雷达配置 三.场景配置 四.SAR 信号模拟 五.总结 六.程序 此示例说明如何使用线性 FM (LFM) 波形对基于带状图的合成孔径雷达 (SAR) 系统进行建模.S ...

  9. 【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码和演示视频)

    需要源码和配置文件请点赞关注收藏后评论区留言~~~ 一.基于机器学习的语音推断 Tensorflow基于分层和模块化的设计思想,整个框架以C语言的编程接口为界,分为前端和后端两大部分 Tensorfl ...

最新文章

  1. C语言如何返回格式化日期时间(格式化时间)?(将日期和时间以字符串格式输出)ctime()、asctime()、localtime()、strftime()
  2. 转换到 COFF 期间失败: 文件无效或损坏
  3. 二分算法php,PHP练习-二分查找算法
  4. opencsv : 解析CSV
  5. android.os.build修改,Android的os.BuildID对应的SDK版本号以及SDK版本号与APILevel对应关系.docx...
  6. 计算机组成原理平均cpi怎么算_2020考研 | 计算机统考408院校盘点,408考试内容难易分析...
  7. 不同型号的二极管模块并联_电阻可以串联,为何二极管不适合串联?
  8. Linux学习笔记之1——文件和目录管理(硬连接和软连接)(连结档,相当于快捷方式)...
  9. 使用 Item,ItemManager 在 XNA 中创建物品和道具(十六)
  10. Transact-SQL编程规范
  11. html+css+js的生日祝福网页+更改教程
  12. 打印机提示更换墨盒,但打印字仍很清晰,打印机设置还能用很久
  13. Mysql获取流水号
  14. c++ socket下ipv4到ipv6的移植
  15. 电脑桌面计算机打开不显示硬盘信息,Win10电脑下移动硬盘不显示盘符如何解决...
  16. ip漂移技术_您的项目是否遭受技术漂移的困扰?
  17. c语言 ppm 大小,PPM图像处理器
  18. 手机隐藏ip地址的方法简单设置
  19. 浅谈车载 Android 开发趋势~
  20. 漫谈程序员系列:怎样成为技术达人

热门文章

  1. 【多元统计分析与R语言】【详解】使用教材P84页表3-2进行多元数据简单R分析:定量变量的分析(直方图、散点图)、定性变量的分析并绘制绘制均值条图、箱尾图、星相图、调和曲线图
  2. UVA 10158 (记忆化搜索)
  3. HTML详解(3.为什么要学习html)
  4. Matplotlib绘图:plt?plt.subplots?plt.subplot?
  5. bootstrap手风琴_快速提示:如何自定义Bootstrap 4的手风琴组件
  6. 腾讯云大学大咖分享 | 自然语言处理技术(NLP)究竟能做些什么?
  7. Java中String类intern()详解
  8. sourcemap(未完,待续)
  9. 微信小程序初探【类微信UI聊天简单实现】
  10. scratch无奈的Jaime 电子学会图形化编程scratch等级考试一级真题和答案解析2021-9