在后端项目中,难免遇到需要写接口文档方便第三方调用的场景,一般业界最常用的方案是使用swagger。Java项目中,一般采用springfox项目,它集成了swagger和swagger-ui,不需要单独部署项目,可让文档随着项目一起发布。

为什么不使用swagger-ui

但是开源项目往往是开源一时热,事后拂衣去,缺少维护。这个项目已经两年多没有维护了,很多人在issue反馈过bug,作者一年前表示自己比较忙,没空维护。

springfox最新的版本是2.9.2,不支持spring5(虽然有个快照版支持spring5,但一直没发布,整合也有点麻烦)。spring5比较大的一个改变就是增加了webflux,因此旧版springfox无法兼容spring5的

其实用快照版,稍作修改也能让springfox支持webflux,但是我不是很喜欢这种做法。一个是增加了打包体积和运行内存占用,另一个则是swagger的使用污染了Java源码,很是不美观,强迫症不能忍。

@RestController@RequestMapping("/dataspace/api/v1/hive")@Api(value = "hive", description = "hive资源管理")public class HiveManagerController {    @Autowired    HiveManagerService hiveManagerService;    @RequestMapping(value = "/list", method = {RequestMethod.POST})    @ApiOperation(value = "资源列表", notes = "")    public PageResult showPublic(@ApiParam(value = "hive查询对象")                                          @RequestBody PageReqParam hiveReq) {        result = hiveManagerService.getList(hiveReq);        return result;    }

源码中混入了各种ApiParam、Api、ApiOperation注解。

再加上我现在使用的springcloud套件,需要在gateway的feign接口上加注释,这样的话,无论是springfox,还是很多第三方的api doc工具都很难胜任。

扩展JDK自带工具javadoc

于是,我想到了另外一种方法,就是javadoc。然而javadoc自带的注解很有限,不能满足第三方对文档的需求,比如

 /**     * 根据节点名删除主机     * @method DELETE     * @path host/delHostByNodeName     * @param nodeName 节点名     * @param cluster 集群名     * @return JSON     */    @DeleteMapping("/delHostByNodeName")    public String delHostByNodeName(@RequestParam("nodeName") String nodeName,@RequestParam("cluster") String cluster);

javadoc并不认识method和path这两个注解,生成的文档还是缺少一些必须要的信息。

这个不难,扩展下taglet即可。

先引入maven依赖

jdk.tools            jdk.tools            1.8system${JAVA_HOME}/lib/tools.jar

扩展taglet代码

package com.github.cloud.ali.common.tool;import com.sun.javadoc.Tag;import com.sun.tools.doclets.Taglet;import java.util.Map;public class MethodTaglet implements Taglet {    private String NAME = "HTTP请求类型";    private String HEADER = "HTTP请求类型:";    @Override    public boolean inField() {        return false;    }    @Override    public boolean inConstructor() {        return false;    }    @Override    public boolean inMethod() {        return true;    }    @Override    public boolean inOverview() {        return true;    }    @Override    public boolean inPackage() {        return true;    }    @Override    public boolean inType() {        return true;    }    @Override    public boolean isInlineTag() {        return false;    }    @Override    public String getName() {        return NAME;    }    @Override    public String toString(Tag tag) {        return "" + HEADER + ""                + "

" + tag.text() + ""; } @Override public String toString(Tag[] tags) { return ""; }}

同理,path注解也是类似的实现。编译命令如下:

javadoc -protected -splitindex -use -author -version -encoding utf-8 -charset utf-8 -d /usr/jackma/doc  -windowtitle "ali 文档"  $(ls /usr/jackma/ali/ali-common/src/main/java/com/github/cloud/ali/common/model/*.java |tr "" " ") $(ls /usr/jackma/ali/ali-gateway/src/main/java/com/github/cloud/ali/feign/*.java |tr "" " ") -tag method:a:"HTTP请求方法:" -tag path:a:"请求路径:"  -tagletpath /usr/jackma/ali/ali-common/src/main/java/com/github/cloud/ali/common/tool/MethodTaglet.java  -tagletpath /usr/jackma/ali/ali-common/src/main/java/com/github/cloud/ali/common/tool/PathTaglet.java -taglet com.github.cloud.ali.common.tool.MethodTaglet -taglet com.github.cloud.ali.common.tool.PathTaglet

其实就是在javadoc这个JDK自带工具的命令里加上了taglet参数,指定了自定义注解。

最终效果如下:

增强版javadoc

可以看到,文档内容更详细,显示也更美观了。

还可以进一步,加上数据类型的注解,这样就更完善了。

虽然离swagger-ui还有点差距,但是比原版javadoc好多了。最大的优点是没有任何限制和对源码的污染。

不得不说,Java的扩展性确实很好。

总结

swagger-ui优点:

1.集成度高,文档随项目一期发布

2.文档内容详细,并且带有调试工具

3.可导出json文件,界面可自定义

swagger-ui缺点:

1.引入第三方依赖,增加打包体积和运行内存

2.兼容性差,无法通用于所有Java项目

3.对源码有侵入,污染Java源代码

4.缺乏维护和更新

扩展javadoc优点:

1.源码无侵入

2.扩展性强,兼容性高

扩展javadoc缺点:

1.界面不够美观,文档不具有通用性

2.需要手工维护文档生成命令

delphi ui编辑工具源码_一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案相关推荐

  1. semantic ui中文文档_求你别再用swagger了,给你推荐几个在线文档生成神器

    开局先推荐: Java面试刷题网站​www.javazhiyin.com 前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在 ...

  2. delphi gui编辑工具源码_Python 快速构建一个简单的 GUI 应用

    点击上方"AirPython",选择"加为星标" 第一时间关注 Python 技术干货! 1. 介绍 Python GUI 常用的 3 种框架是:Tkinter ...

  3. 猿创征文|小而巧的API文档生成工具之smart-doc

    文章目录 smart-doc介绍 smart-doc特性 smart-doc的最佳搭档 谁在使用smart-doc smart-doc的优缺点 smart-doc和swagger区别比较 smart- ...

  4. php自写api文档生成工具

    框架改版后的第二个版本定下来了,这两天也比较轻松,于是就折腾给项目建个好看的api文档. 各种折腾.先是折腾phpDocumentor2,用phpdoc开源工具来建立文档,好不容易安装成功,各个模板都 ...

  5. apiDoc 一款很不错api文档生成工具

    apiDoc 一款很不错api文档生成工具,在开发接口的时候,需要给同事看相应的接口文档.给大家推荐一个生成文档的工具--apiDoc,最后生成的文档以网页的形式发布,方便快捷,便于阅读. 创建项目目 ...

  6. android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  7. 一款零注解侵入的 API 文档生成工具,你用过吗?

    以下文章来源方志朋的博客,回复"666"获面试宝典 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart ...

  8. springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  9. java smart算法_Java Restful API 文档生成工具 smart-doc

    谁说生成api文档就必须要定义注解? 谁说生成接口请求和返回示例必须要在线? 用代码去探路,不断尝试更多文档交付的可能性. 如果代码有生命,为什么不换种方式和它对话! 一.背景 没有背景.就自己做自己 ...

最新文章

  1. Linux学习(十五)---Python定制篇---apt软件管理和远程登录
  2. libpcap捕包机制分析(三)
  3. vue v-if指令
  4. 开发HTML5手机游戏的5个注意要点--手机开发前景-- 转
  5. ACM算法--二分法--模板
  6. [Grid Layout] Place grid items on a grid using grid-column and grid-row
  7. 怎么撤回操作_微信又更新,拍一拍能撤回了
  8. 花书+吴恩达深度学习(二二)自编码器(欠完备,DAE,CAE,PSD)
  9. 计算机地图制图的点状符号制作,计算机地图制图验手册汇编.doc
  10. elasticsearch(七)java 搜索功能Search Request的介绍与使用
  11. 基于SpringBoot 学生成绩管理系统的设计与实现
  12. PHP的消息队列详解
  13. 知乎80万高赞的window10壁纸
  14. php微信公众号支付实例教程,PHP微信公众号支付教程(含图文)
  15. MCUXpresso开发NXP RT1060(3)——移植LVGL到NXP RT1060
  16. 工业交换机的内部组成是什么?
  17. 云时代的IT应用质量管理新动向
  18. 2022届秋招,从被拒到上岸 | 谈谈YK菌在2021年的经历与收获
  19. 中国人发假发和延伸行业市场供需与战略研究报告
  20. 网页PDF下载,有了这3种方法,文档随便下

热门文章

  1. 在线音乐用户寄望用爱发电,资本不愿无米之炊
  2. 我月入过万,送着外卖写着诗
  3. 男性护肤热潮难以孕育下一个“完美日记”?
  4. mysql5.6的安装步骤_MySQL5.6安装步骤
  5. heroku能用mysql吗_heroku连接到mysql数据库
  6. python装饰器有几种_python几种装饰器的用法
  7. linux动态分配全局置换,深入理解计算机系统 第九章 虚拟存储器
  8. php中删除评论怎么做的,php实现评论回复删除功能
  9. Python中定义函数的三种形式
  10. Python教程:shift函数实现数据偏移的方法