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

news/2024/5/2 11:21:12/文章来源:https://blog.csdn.net/qq_40124555/article/details/126629409

文章目录

  • smart-doc介绍
  • smart-doc特性
  • smart-doc的最佳搭档
  • 谁在使用smart-doc
  • smart-doc的优缺点
  • smart-doc和swagger区别比较
  • smart-doc的使用姿势
    • 姿势一
    • 姿势二
    • 姿势三(公司内部推荐使用)
  • 总结

smart-doc介绍

一个 java restful api 文档生成工具不用像Swagger一样写大量注解,完全基于接口源码分析来生成接口文档,但是需要按照 java的标准注释写。

完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。

你只需要按照java-doc标准编写注释, smart-doc就能帮你生成一个简易明了的MarkdownHTML5Postman ollection2.0+OpenAPI 3.0+的文档。

注意:需要完全按照java的标准注释,如果方法注释包含特殊符号或者换行的话,生成的json是会出现格式错误,但是不影响相关的html使用。

smart-doc特性

  • 零注解、零学习成本、只需要写标准JAVA注释。
  • 基于源代码接口定义自动推导,强大的返回结构推导。
  • 支持Spring MVCSpring BootSpring Boot Web Flux(Controller书写方式)Feign
  • 支持CallableFutureCompletableFuture等异步接口返回的推导。
  • 支持JavaBean上的JSR303参数校验规范,包括分组验证。
  • JSON请求参数的接口能够自动生成模拟JSON参数。
  • 对一些常用字段定义能够生成有效的模拟值。
  • 支持生成JSON返回值示例。
  • 支持从项目外部加载源代码来生成字段注释(包括标准规范发布的jar包)。
  • 支持生成多种格式文档:MarkdownHTML5AsciidoctorPostman CollectionOpenAPI 3.0。 开放文档数据,可自由实现接入文档管理系统。
  • 支持导出错误码和定义在代码中的各种字典码到接口文档。
  • 支持MavenGradle插件式轻松集成。
  • 支持Apache Dubbo RPC接口文档生成。
  • debug接口调试html5页面完全支持文件上传,下载(@download tag标记下载方法)测试。

smart-doc的最佳搭档

smart-doc + Torna 组成的文档生成和管理解决方案,使用smart-doc无侵入完成JAVA源代码分析和提取注释生成API文档,自动将文档推送到Torna企业级接口文档管理平台。

小而巧的API文档生成工具之smart-doc - Java技术债务

谁在使用smart-doc

小而巧的API文档生成工具之smart-doc - Java技术债务

smart-doc的优缺点

简单总结了几个特别明显以及我认为最关键的几个优点如下:

  • 非侵入式接口文档生成
  • 需要按照java文档注释规范对接口及相关对象添加注释
  • 编译文件后需要手动运行插件生成接口文档
  • 配置简单,只需要引入插件,配置文档输出位置即可。相关更加复杂的配置根据需要自行配置。
  • 无需启动项目,生成文档后可直接浏览

缺点
我总结了一下我使用过程中的缺点,在此我仅代表我自己提出的缺点如下

  • 生成的openapi.json数据时,不支持泛型的多层嵌套解析,导致不同接口的responseBody解析为一个。比如接口返回为:ResultVO<DefinePage<AiOptimizationCampaignReportVO>>,解析成ResultVODefinePage(新版本已解决)

smart-doc和swagger区别比较

功能特性smart-docswagger
代码侵入注解侵入性严重
集成复杂度简单,只需插件偏复杂
插件支持有 gradle 和 maven 插件无插件
openapi 规范支持支持 openapi 3.0完全支持 openapi 的版本
CI 构建集成可在 ci 构建阶段使用maven 或者 gradle 命令启动插件生成文档不支持
集中化文档中心集成已经和 torna 企业级接口文档管理平台对接不支持
维护持续性值得信赖,开源后用户基础多,一直持续维护全球用户多,开源维护值得信赖
接口 debug2.0.0 版本开始已经支持 debug,页面比 swagger 漂亮太多了。支持

Smart-doc 从 2.0.0 后几乎实现了 swagger ui 的功能,并且比 swagger ui 更简洁大方,也更符合国内开发者的诉求。当然 smart-doc 的功能也已经超过了 swagger 为 java 开发者提供的功能。当然 smart-doc 本身是只支持扫描代码生成 openapi 3.0 的文档的,也可以将生成的 openapi 3.0 文档导入到其他 ui 中渲染展示。

swagger 生成 离线的文档 需要借助第三方jar包实现,而 smart-doc 直接 运行 test 方法就可以直接导出 md,html,asciidoc 等格式文档。

设计思路不同,smart-doc 是基于 源码分析的,它生成api文档是通过分析JAVA源码主要是通过 注释 和 系统自带注解,来实现文档的 生成,而 swagger 是运行时 自动生成在线文档,并且 生成 测试 接口的 案例。由于他们设计思路 理念 不一样,swagger2 使用过程需要使用它定义的@API 相关注解,这样就污染了源码,代码入侵有点高,而smart -doc 就不一样了,主要是通过 注释 、解析/** */ 来生成API文档的 。这样基本上没有入侵性,很自由!

swagger

  • 侵入式接口文档生成
  • 每个接口及每个实体类都需要添加注解
  • 配置复杂,需要添加依赖然后需要添加相关配置
  • 编译后自动生成接口文档
  • 需要启动后才能查看,如果配置了安全框架还需要开放相关接口

smart-doc的使用姿势

姿势一

使用maven或者gradle插件进行一键生成对应的文档格式或者命令进行生成,在这里我只展示了maven插件的使用姿势。

<plugin><groupId>com.github.shalousun</groupId><artifactId>smart-doc-maven-plugin</artifactId><version>2.4.9</version><configuration><!--指定生成文档的使用的配置文件,配置文件放在自己的项目中--><configFile>./src/main/resources/smart-doc.json</configFile><!--指定项目名称--><projectName>测试</projectName><!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉--><excludes><!--格式为:groupId:artifactId;参考如下--><!--也可以支持正则式如:com.alibaba:.* --><exclude>com.alibaba:fastjson</exclude></excludes><!--includes配置用于配置加载外部依赖源码,配置后插件会按照配置项加载外部源代码而不是自动加载所有,因此使用时需要注意--><!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件--><includes><!--格式为:groupId:artifactId;参考如下--><!--也可以支持正则式如:com.alibaba:.* --><include>com.alibaba:fastjson</include><!-- 如果配置了includes的情况下, 使用了mybatis-plus的分页需要include所使用的源码包 --><include>com.baomidou:mybatis-plus-extension</include><!-- 如果配置了includes的情况下, 使用了jpa的分页需要include所使用的源码包 --><include>org.springframework.data:spring-data-commons</include></includes></configuration><executions><execution><!--如果不需要在执行编译时启动smart-doc,则将phase注释掉--><phase>compile</phase><goals><!--smart-doc提供了html、openapi、markdown等goal,可按需配置--><goal>html</goal></goals></execution></executions>
</plugin>

如果配置<phase>clean|validate|compile|test|package|verify|install|site|deploy</phase>这些,可以在以上指令被触发时执行smart-doc文档生成

使用maven插件命令如下:

//生成html
mvn -Dfile.encoding=UTF-8 smart-doc:html
//生成markdown
mvn -Dfile.encoding=UTF-8 smart-doc:markdown
//生成adoc
mvn -Dfile.encoding=UTF-8 smart-doc:adoc
//生成postman json数据
mvn -Dfile.encoding=UTF-8 smart-doc:postman
// 生成 Open Api 3.0+,Since smart-doc-maven-plugin 1.1.5
mvn -Dfile.encoding=UTF-8 smart-doc:openapi
// 生成文档推送到Torna平台
mvn -Dfile.encoding=UTF-8 smart-doc:torna-rest// Apache Dubbo RPC文档
// Generate html
mvn -Dfile.encoding=UTF-8 smart-doc:rpc-html
// Generate markdown
mvn -Dfile.encoding=UTF-8 smart-doc:rpc-markdown
// Generate adoc
mvn -Dfile.encoding=UTF-8 smart-doc:rpc-adoc// 生成dubbo接口文档推送到torna
mvn -Dfile.encoding=UTF-8 smart-doc:torna-rpc

使用IDE一键生成如下:

小而巧的API文档生成工具之smart-doc - Java技术债务

优点:便捷,快速上手

缺点:每个服务各自指定smart-doc的配置文件smart-doc.json

姿势二

导入相关smart-doc依赖

<!--导入Smart-doc依赖-->
<dependency><groupId>com.github.shalousun</groupId><artifactId>smart-doc</artifactId><version>2.5.1</version>
</dependency>

手动为每个项目引入以上jar包,可以使用smart-doc.json配置文件也可以使用smart-doc自带的ApiConfig配置类进行手动配置。

使用单元测试测试API文档生成如下:

@Test
public void testBuilderControllersApi() {ApiConfig config = new ApiConfig();config.setServerUrl("http://localhost:8080");//当把AllInOne设置为true时,Smart-doc将会把所有接口生成到一个Markdown、HHTML或者AsciiDoc中config.setAllInOne(true);//HTML5文档,建议直接放到src/main/resources/static/doc下,Smart-doc提供一个配置常量HTML_DOC_OUT_PATH//源码---String HTML_DOC_OUT_PATH = "src/main/resources/static/doc";config.setOutPath("src/main/resources/static/doc");// 设置接口包扫描路径过滤,如果不配置则Smart-doc默认扫描所有的接口类// 配置多个报名有英文逗号隔开config.setPackageFilters("com.***.Controller.*");//设置错误错列表,遍历自己的错误码设置给Smart-doc即可List<ApiErrorCode> errorCodeList = new ArrayList<>();for (HttpCodeEnum codeEnum : HttpCodeEnum.values()) {ApiErrorCode errorCode = new ApiErrorCode();errorCode.setValue(codeEnum.getCode()).setDesc(codeEnum.getMessage());errorCodeList.add(errorCode);}//不需要显示错误码,则可以不用设置错误码。config.setErrorCodes(errorCodeList);//生成Markdown文件HtmlApiDocBuilder.buildApiDoc(config);
}

姿势三(公司内部推荐使用)

Q:为什么说公司内部建议使用呢?
:每个公司都会有自己的maven仓库(几乎),可以搞一些定制化的工具包,比如:日志、认证、链路、授权等。可以在工具包中加入smart-doc包进行简单开发。

可以这么做:
将smart-doc集成到工具包中,在工具包进行打包,提供给使用方,然后定制开发进行配置化管理

每个Java业务服务引入公共jar包,然后进行配置,自定义配置如下:

# 是否开启html生成,默认为false
smart-doc.html-enable=true
# html生成路径,默认为当前服务子目录doc下
smart-doc.out-path=/doc/
# 接口返回对象配置
smart-doc.response-class-name=com.sparkxmedia.xplatform.sd.api.common.result.ResultVO
# 自定义请求头
smart-doc.request-header.username=zane
smart-doc.request-header.user_id=1
smart-doc.request-header.authorization=test
# controller层包
smart-doc.package-filters=com.sparkxmedia.xplatform.sd.api.ai.controller.*,com.sparkxmedia.xplatform.sd.api.controller.*
# 如果使用swagger-ui替代smart-doc的html,则需配置获取openapi.json路径
springdoc.swagger-ui.url=/sd-api/doc/openapi.json

其核心代码如下:

package com.cuizb.tools.starter.config.doc;import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author: Java技术债务* @Date: 2021/6/6 20:03* Describe: 跨域解决,映射生成的静态资源*/
@Slf4j
@Configuration
@EnableConfigurationProperties({ApiDocProperties.class})
public class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate ApiDocProperties apiDocProperties;/*** 解决跨域问题* @param registry*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedHeaders("*").allowedMethods("*").allowedOriginPatterns("/**").maxAge(3600);}@SneakyThrows@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 当前项目根路径String rootPath = ResourceUtils.getURL("").getPath();// 文档保存绝对路径rootPath = rootPath.substring(0, rootPath.length() - 1) + apiDocProperties.getOutPath();// 映射到当前项目根路径+用户自定义路径(当前仅支持当前项目下路径)String resourcesPath;if ("dev".equals(apiDocProperties.getProfileActive()) || "local".equals(apiDocProperties.getProfileActive())) {resourcesPath = "file:///" + rootPath;} else {resourcesPath = "file:///" + apiDocProperties.getOutPath();}log.info(">>>>>>>>>>>>>" + resourcesPath);//配置静态资源映射registry.addResourceHandler("/doc/static/**").addResourceLocations(resourcesPath);}}
package com.cuizb.tools.starter.config.doc;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;/*** @author Java技术债务* @date 2022-08-17 15:08* Be in awe of every code modification*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Configuration
@ConfigurationProperties(prefix = "smart-doc")
public class ApiDocProperties {@Value("${server.port}")private int port;@Value("${app.id}")private String appId;@Value("${server.servlet.context-path:}")private String pathFilter;@Value("${spring.profiles.active:dev}")private String profileActive;private boolean htmlEnable;private String outPath;private String responseClassName;private Map<String, String> requestHeader = new HashMap<>();private String packageFilters;
}
/*** @author Java技术债务* @date 2022-08-16 18:17* Be in awe of every code modification*/
@Slf4j
@EnableConfigurationProperties({ApiDocProperties.class})
@Controller
//@RequestMapping("${spring.application.name}/doc")
@Profile({"dev", "local", "qa", "test", "sit", "uat"})
@RequestMapping("/doc")
public class DocController {@Autowiredprivate ApiDocProperties apiDocProperties;private ApiDocConfig apiDocConfig;public DocController() {}@GetMapping("/openapi.json")@ResponseBodypublic String openapi() {initApiDocConfig();ApiConfig config = apiDocConfig.getApiConfig();return OpenApiBuilder.buildOpenApi(config).trim().replace(" ", "");}@GetMapping("/build")public String buildHtml() {initApiDocConfig();... ...}
}

代码解释:

  • WebMvcConfig解决跨域以及文件映射,由开发人员决定是否使用smart-doc生成的API接口文档页面,因为有的已经使用了其他产品,可以将smart-doc生成的json同步到现有的产品,当然如果你只使用smart-doc的话,不需要配置文件映射。
  • ApiDocProperties自定义配置,开发人员只关心自己当前服务的smart-doc相关配置即可
  • DocController工具包中的uri进行资源访问,可以自定义html,openapi.json等路径。也可以自定义开发,生成json文件或者json字符串等。

当前为了适用本公司,简单的自定义了一些开发,以下是简单的配置了一些路径资源:

  • 获取openapi.json地址:http://localhost:port[/server-servlet-context-path]/doc/openapi.json
  • 构建html文件地址:http://localhost:port[/server-servlet-context-path]/doc/build
  • html接口文档地址:http://localhost:port[/server-servlet-context-path]/doc/static/index.html

如果你想使用这种的话,你可以继续研究与开发。。。

总结

可以入手使用,关键是零侵入,还支持dubbo方式(虽然我未体验使用此方式)

谢谢阅读,如果有不一样的见解,请评论说出你的观点以及见解。。。觉得不错的话,介意点个赞吗?我知道你不介意,谢谢哈。。。

一些工具特性介绍等引用smart-doc官方文档:https://smart-doc-group.github.io/#/zh-cn/start/quickstart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_3848.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了进大厂!吃透了各大厂最新 3000+Java 面试题,啃完面试肯定妥了!

在很多企业&#xff0c;都有 KPI 考核&#xff0c;然后在此基础上还会弄个“末位淘汰”( 或者叫“人员优化”)。互联网大厂残酷现状在此&#xff0c;无法避免&#xff0c;为了助力程序员朋友们跳槽面试、升职加薪、职业困境&#xff0c;提高自己的技术&#xff0c;逃脱掉“人员…

【翻译】A Closed-form Solution to Universal Style Transfer

通用风格迁移的闭式解决方案 文章目录Abstract1. Introduction2. Related Work3. 动机4. Method5. Results5.1. 定性结果5.2. 定量结果5.3. 更多结果5.4. 限制条件6. 结论Abstract 通用风格转换试图明确地将特征空间的损失降到最低&#xff0c;因此它不需要对任何预先定义的风…

牛视源码定制,抖音矩阵系统,别和谐啊、、、

抖音SEO内容如何制作&#xff1f; 现在网上有很多这种关于自己行业的一些数据分析的一些文章&#xff0c;大家可以去看一下。 所以看到这里&#xff0c;我们把做好抖音SEO需要的步骤其实也就四步&#xff0c;但是过程是需要不断的测试和优化。 四、SEO如何优化&#xff1f; …

配置本地Maven仓库——IDEA配置本地Maven源

Maven基础配置 现在大多数都是使用maven管理项目所需的资源文件&#xff0c;可是因为maven的远程仓库多数都很难下载&#xff0c;所以我们可以通过配置国内镜像&#xff0c;配置本地maven源。 1、下载maven maven下载链接 2、maven下载后是一个压缩包&#xff0c;直接解压即可…

利用HFSS-API设计指数渐变传输线

学个Antenna是以天线仿真和调试为主&#xff0c;理论原理为辅的干货天线技术专栏&#xff0c;包括天线入门知识以及各类天线的原理简介、仿真软件建模、设计、调试过程及思路。如有想看到的内容或技术问题&#xff0c;可以在文尾写下留言。 ​摘要&#xff1a; 上节学个Antenna…

纵横网络靶场 刷题记录

目录 Modbus协议 MMS协议分析 大工UDP协议 工控蜜罐日志分析 隐信道数据安全分析 工控安全取证 隐藏的黑客 Modbus协议 黑客通过外网进入一家工厂的控制网络&#xff0c;之后对工控网络中的操作员站系统进行了攻击&#xff0c;最终通过工控协议破坏了正常的业务。我们得…

Linux学习笔记

Linux安装在VM上 直接安装即可&#xff0c;或者打开VMX文件&#xff0c;挂载到VM上 Linux的目录结构 /代表根目录。~不同的用户&#xff0c;代表的目录不同。 超级管理员用户&#xff1a;root&#xff0c;终端中显示~&#xff0c;表示/root目录 普通用户&#xff1a;在hom…

手写一个泛型双向链表

前言 在当前大环境的背景下面试不问点算法都不算个合格的面试了&#xff08;卷&#xff09;&#xff0c;而与算法紧密相关的数据结构也是经常问到的&#xff0c;像集合、链表、树、图、栈、堆、队列、矩阵 等等等等。 是不是感觉难度如下&#xff1a; 集合&#xff1a;有手就…

分布式缓存Hazelcast的部署及与SpringBoot整合使用

目录一、简介二、安装2.1 使用Docker形式部署2.2 客户端命令行2.3 Web管理页面三、与SpringBoot项目整合3.1 pom依赖3.2 配置类3.3 使用方式一、简介 官方文档&#xff1a;https://docs.hazelcast.com/hazelcast/latest/clients/java Github地址:https://github.com/hazelcast…

《MeInGame: Create a Game Character Face from a Single Portrait 》论文解读

一&#xff1a;论文干了件什么事 从单张图片生成一个游戏中的虚拟形象&#xff0c;且&#xff0c;论文的方法对光照强度&#xff0c;光照阴影遮挡等具有很好的鲁棒性&#xff0c;可以忠实还原肤色、妆容和皱纹等个性化细节。 摘要&#xff1a; 近年来&#xff0c;基于深度学习…

使用iptables动态映射Docker容器端口

0x0. 安装telnet telnet介绍&#xff1a;https://zh.wikipedia.org/wiki/Telnet 本文用于测试指定端口是否开放&#xff0c;命令如下&#xff1a; telnet [ip] [port]参数解释&#xff1a; ip&#xff1a;ip地址port&#xff1a;端口 如果指定端口开放则结果如下&#xff1a…

Libra论文阅读笔记-A unified congestion control framework for diverse application

目录一、Overview二、问题背景三、Libra方案overview四、Libra方案设计五、RL-based CCA算法总结论文题目&#xff1a;《A unified congestion control framework for diverse application preferences and network conditions》 CoNEXT’21 一、Overview 目前的拥塞控制算法(…

Python代码优化工具——memory_profiler

Python代码优化工具——memory_profiler一、工具介绍二、安装三、分析结果注解四、使用1、使用python命令进行分析&#xff08;1&#xff09;使用姿势1&#xff08;2&#xff09;示例1&#xff08;3&#xff09;该姿势的利弊1&#xff08;4&#xff09;使用姿势2&#xff08;5&…

Python 程序员过中秋

Python 程序员过中秋 又是一年中秋至-----花好月圆夜&#xff0c;佳文当共鉴。Python PyQt5制作音乐播放界面 CSDN官方活动征文入口 文章目录1. 引言1.1 编写目的1.2 术语1.3 项目开发环境2. 业务概述3.PyQt5简单介绍3.1 手机上的Qt无处不在3.2 惊人的图形能力和性能3.3 Qt 5…

多线程编程(二):List组装

在日常工作中&#xff0c;难免遇到在循环体中组装List的场景&#xff0c;一般来说&#xff0c;不考虑多线程的话&#xff0c;实现起来非常简单。 比如&#xff0c;拟定一个场景&#xff0c;给定0-9999&#xff0c;共10000个数字&#xff0c;组装2个列表&#xff1a;奇数列表、…

Windows与网络基础-7-windows基本命令-目录文件操作

Windows基础命令 目录 一、目录和文件的应用操作 1.1 cd命令 1.2 dir命令 1.3 md或mkdir 1.4rd或rmdir 1.5 move 1.6 copy 1.7 Xcopy 1.8 Del或rease 目标&#xff1a; 掌握windwos系统文件及目录操作的一些命令 掌握windwos网络相关的命令 Window输入命令&#xff…

odoo15 联系人只看自己的设置注意点

今天设置crm模块权限时,联系人单加一个权限,不起作用 经反复设置,最后发现,最后一条无论如何设,不起作用。 class Partner(models.Model):_description = Contact_inherit = [format.address.mixin, avatar.mixin]_name = "res.partner"_order = "displa…

python神经网络编程 豆瓣,用python构建神经网络

python深度学习框架学哪个 Python深度学习生态系统在这几年中的演变实属惊艳。pylearn2&#xff0c;已经不再被积极地开发或者维护&#xff0c;大量的深度学习库开始接替它的位置。这些库每一个都各有千秋。 我们已经在indico的产品或者开发中使用了以下列表中的大部分的技术…

Django-(2)

今日内容概览 静态文件及相关配置请求方法request对象方法pycharm连接MySQLDjango谅解MySQLDjango ormorm语法orm外键关联 静态文件及相关配置 静态文件&#xff1a;html页面上使用的&#xff0c;不会进程改变的资源 第三方框架文件css文件js文件图片文件 针对静态文件资源…

token、cookie、session

目录 cookie session token cookie和token对比 刚刚下班的时候&#xff0c;路上碰到以前带的新人&#xff0c;他说他们那边最近在给一个新系统做新的权限校验&#xff0c;采用JWT的方式&#xff0c;这个新人也做没多久&#xff0c;说自己不了解token、cookie、session的区别…