通过Swagger系列可以快速生成API文档,但是这种API文档生成是需要在接口上添加注解等,这表明这是一种侵入式方式; 那么有没有非侵入式方式呢, 比如通过注释生成文档? 本文主要介绍非侵入式的方式及集成Smart-doc案例。我们构建知识体系时使用Smart-doc这类工具并不是目标,而是要了解非侵入方式能做到什么程度和技术思路。 @pdai

准备知识点

需要了解Swagger侵入性和依赖性, 以及Smart-Doc这类工具如何解决这些问题, 部分内容来自官方网站。@pdai

为什么会产生Smart-Doc这类工具?

既然有了Swagger, 为何还会产生Smart-Doc这类工具呢? 本质上是Swagger侵入性和依赖性。

我们来看下目前主流的技术文档工具存在什么问题:

  1. 侵入性强,需要编写大量注解,代表工具如:swagger,还有一些公司自研的文档工具
  2. 强依赖性,如果项目不想使用该工具,业务代码无法编译通过。
  3. 代码解析能力弱,使用文档不齐全,主要代表为国内众多开源的相关工具。
  4. 众多基于注释分析的工具无法解析jar包里面的注释(sources jar包),需要人工配置源码路径,无法满足DevOps构建场景。
  5. 部分工具无法支持多模块复杂项目代码分析。

什么是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+的文档。

  • 零注解、零学习成本、只需要写标准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标记下载方法)测试。

实现案例

从smart-doc 1.7.9开始官方提供了Maven插件,可以通过在项目中集成smart-doc的Maven插件,然后运行插件直接生成文档。 我们的案例基于smart-doc-maven-plugin,生成文档。示例参考官方配置文档而写。

配置

添加maven的插件

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. <plugin>
  8. <groupId>com.github.shalousun</groupId>
  9. <artifactId>smart-doc-maven-plugin</artifactId>
  10. <version>2.4.8</version>
  11. <configuration>
  12. <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
  13. <configFile>./src/main/resources/smart-doc.json</configFile>
  14. <!--指定项目名称,推荐使用动态参数,例如${project.description}-->
  15. <!--如果smart-doc.json中和此处都未设置projectName,2.3.4开始,插件自动采用pom中的projectName作为设置-->
  16. <!--<projectName>${project.description}</projectName>-->
  17. <!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
  18. <excludes>
  19. <!--格式为:groupId:artifactId;参考如下-->
  20. <!--也可以支持正则式如:com.alibaba:.* -->
  21. <exclude>com.alibaba:fastjson</exclude>
  22. </excludes>
  23. <!--includes配置用于配置加载外部依赖源码,配置后插件会按照配置项加载外部源代码而不是自动加载所有,因此使用时需要注意-->
  24. <!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件-->
  25. <includes>
  26. <!--格式为:groupId:artifactId;参考如下-->
  27. <!--也可以支持正则式如:com.alibaba:.* -->
  28. <include>com.alibaba:fastjson</include>
  29. </includes>
  30. </configuration>
  31. <executions>
  32. <execution>
  33. <!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
  34. <phase>compile</phase>
  35. <goals>
  36. <!--smart-doc提供了html、openapi、markdown等goal,可按需配置-->
  37. <goal>html</goal>
  38. </goals>
  39. </execution>
  40. </executions>
  41. </plugin>
  42. </plugins>
  43. </build>

其中./src/main/resources/smart-doc.json是配置文件。

  1. {
  2. "serverUrl": "http://127.0.0.1", //服务器地址,非必须。导出postman建议设置成http://{{server}}方便直接在postman直接设置环境变量
  3. "pathPrefix": "", //设置path前缀,非必须。如配置Servlet ContextPath 。@since 2.2.3
  4. "isStrict": false, //是否开启严格模式
  5. "allInOne": true, //是否将文档合并到一个文件中,一般推荐为true
  6. "outPath": "D://md2", //指定文档的输出路径
  7. "coverOld": true, //是否覆盖旧的文件,主要用于markdown文件覆盖
  8. "createDebugPage": true,//@since 2.0.0 smart-doc支持创建可以测试的html页面,仅在AllInOne模式中起作用。
  9. "packageFilters": "",//controller包过滤,多个包用英文逗号隔开,2.2.2开始需要采用正则:com.test.controller.*
  10. "md5EncryptedHtmlName": false,//只有每个controller生成一个html文件时才使用
  11. "style":"xt256", //基于highlight.js的代码高设置,可选值很多可查看码云wiki,喜欢配色统一简洁的同学可以不设置
  12. "projectName": "pdai-springboot-demo-smart-doc",//配置自己的项目名称,不设置则插件自动获取pom中的projectName
  13. "skipTransientField": true,//目前未实现
  14. "sortByTitle":false,//接口标题排序,默认为false,@since 1.8.7版本开始
  15. "showAuthor":true,//是否显示接口作者名称,默认是true,不想显示可关闭
  16. "requestFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  17. "responseFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  18. "inlineEnum":true,//设置为true会将枚举详情展示到参数表中,默认关闭,//@since 1.8.8版本开始
  19. "recursionLimit":7,//设置允许递归执行的次数用于避免一些对象解析卡主,默认是7,正常为3次以内,//@since 1.8.8版本开始
  20. "allInOneDocFileName":"index.html",//自定义设置输出文档名称, @since 1.9.0
  21. "requestExample":"true",//是否将请求示例展示在文档中,默认true,@since 1.9.0
  22. "responseExample":"true",//是否将响应示例展示在文档中,默认为true,@since 1.9.0
  23. "ignoreRequestParams":[ //忽略请求参数对象,把不想生成文档的参数对象屏蔽掉,@since 1.9.2
  24. "org.springframework.ui.ModelMap"
  25. ],
  26. "dataDictionaries": [{ //配置数据字典,没有需求可以不设置
  27. "title": "http状态码字典", //数据字典的名称
  28. "enumClassName": "tech.pdai.springboot.smartdoc.constant.ResponseStatus", //数据字典枚举类名称
  29. "codeField": "responseCode",//数据字典字典码对应的字段名称
  30. "descField": "description"//数据字典对象的描述信息字典
  31. }],
  32. "errorCodeDictionaries": [{ //错误码列表,没有需求可以不设置
  33. "title": "title",
  34. "enumClassName": "tech.pdai.springboot.smartdoc.constant.ResponseStatus", //错误码枚举类
  35. "codeField": "responseCode",//错误码的code码字段名称
  36. "descField": "description"//错误码的描述信息对应的字段名
  37. }],
  38. "revisionLogs": [{ //文档变更记录,非必须
  39. "version": "1.1", //文档版本号
  40. "revisionTime": "2022-07-01 22:12:01", //文档修订时间
  41. "status": "update", //变更操作状态,一般为:创建、更新等
  42. "author": "pdai", //文档变更作者
  43. "remarks": "init user api" //变更描述
  44. },{ //文档变更记录,非必须
  45. "version": "1.2", //文档版本号
  46. "revisionTime": "2022-07-01 22:12:02", //文档修订时间
  47. "status": "update", //变更操作状态,一般为:创建、更新等
  48. "author": "pdai", //文档变更作者
  49. "remarks": "add address api" //变更描述
  50. }
  51. ],
  52. "customResponseFields": [{ //自定义添加字段和注释,一般用户处理第三方jar包库,非必须
  53. "name": "code",//覆盖响应码字段
  54. "desc": "响应代码",//覆盖响应码的字段注释
  55. "ownerClassName": "org.springframework.data.domain.Pageable", //指定你要添加注释的类名
  56. "ignore":true, //设置true会被自动忽略掉不会出现在文档中
  57. "value": "00000"//设置响应码的值
  58. }],
  59. "requestHeaders": [{ //设置请求头,没有需求可以不设置
  60. "name": "token",//请求头名称
  61. "type": "string",//请求头类型
  62. "desc": "desc",//请求头描述信息
  63. "value":"token请求头的值",//不设置默认null
  64. "required": false,//是否必须
  65. "since": "-",//什么版本添加的改请求头
  66. "pathPatterns": "/app/test/**",//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
  67. "excludePathPatterns":"/app/page/**"//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
  68. },{
  69. "name": "appkey",//请求头
  70. "type": "string",//请求头类型
  71. "desc": "desc",//请求头描述信息
  72. "value":"appkey请求头的值",//不设置默认null
  73. "required": false,//是否必须
  74. "pathPatterns": "/test/add,/testConstants/1.0",//正则表达式过滤请求头,url匹配上才会添加该请求头,多个正则用分号隔开
  75. "since": "-"//什么版本添加的改请求头
  76. }],
  77. "requestParams": [ //设置公共参数,没有需求可以不设置
  78. {
  79. "name": "configPathParam",//请求名称
  80. "type": "string",//请求类型
  81. "desc": "desc",//请求描述信息
  82. "paramIn": "path", // 参数所在位置 header-请求头, path-路径参数, query-参数
  83. "value":"testPath",//不设置默认null
  84. "required": false,//是否必须
  85. "since": "2.2.3",//什么版本添加的该请求
  86. "pathPatterns": "/app/test/**",//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求高级配置?sort_id=4178978
  87. "excludePathPatterns":"/app/page/**"//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求高级配置?sort_id=4178978
  88. }],
  89. "responseBodyAdvice":{ //自smart-doc 1.9.8起,非必须项,ResponseBodyAdvice统一返回设置(不要随便配置根据项目的技术来配置),可用ignoreResponseBodyAdvice tag来忽略
  90. "className":"tech.pdai.springboot.smartdoc.entity.ResponseResult" //通用响应体
  91. }
  92. }

运行测试

可以通过Maven命令生成文档

  1. //生成html
  2. mvn -Dfile.encoding=UTF-8 smart-doc:html

在IDEA中,也可以通过maven插件构建

maven构建日志如下

  1. [INFO] Scanning for projects...
  2. [INFO]
  3. [INFO] --------------< tech.pdai:115-springboot-demo-smart-doc >---------------
  4. [INFO] Building 115-springboot-demo-smart-doc 1.0-SNAPSHOT
  5. [INFO] --------------------------------[ jar ]---------------------------------
  6. [INFO]
  7. [INFO] >>> smart-doc-maven-plugin:2.4.8:html (default-cli) > compile @ 115-springboot-demo-smart-doc >>>
  8. [INFO]
  9. [INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ 115-springboot-demo-smart-doc ---
  10. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  11. [INFO] Using 'UTF-8' encoding to copy filtered properties files.
  12. [INFO] Copying 0 resource
  13. [INFO] Copying 1 resource
  14. [INFO]
  15. [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ 115-springboot-demo-smart-doc ---
  16. [INFO] Nothing to compile - all classes are up to date
  17. [INFO]
  18. [INFO] <<< smart-doc-maven-plugin:2.4.8:html (default-cli) < compile @ 115-springboot-demo-smart-doc <<<
  19. [INFO]
  20. [INFO]
  21. [INFO] --- smart-doc-maven-plugin:2.4.8:html (default-cli) @ 115-springboot-demo-smart-doc ---
  22. [INFO] ------------------------------------------------------------------------
  23. [INFO] Smart-doc Start preparing sources at: 2022-07-01 22:43:54
  24. [INFO] Artifacts that the current project depends on: ["org.springframework.boot:spring-boot-starter-web","org.springframework.boot:spring-boot-configuration-processor","org.projectlombok:lombok"]
  25. [INFO] Smart-doc has loaded the source code path: [{"path":"D:/git/tech-pdai-spring-demos/115-springboot-demo-smart-doc/src/main/java"}]
  26. [INFO] Smart-doc Starting Create API Documentation at: 2022-07-01 22:43:54
  27. [INFO] API documentation is output to => D://md2
  28. [INFO] ------------------------------------------------------------------------
  29. [INFO] BUILD SUCCESS
  30. [INFO] ------------------------------------------------------------------------
  31. [INFO] Total time: 2.196 s
  32. [INFO] Finished at: 2022-07-01T22:43:55+08:00
  33. [INFO] ------------------------------------------------------------------------

构建后的html如下:

也可以看到还自动提供了mock的数据,以及测试接口的按钮。还包含自定义的返回枚举类型等。

展示效果,可以参看https://api.doubans.com/

生成更多类型的文档

smart-doc 还支持生成如下类型的文档:

  1. //生成markdown
  2. mvn -Dfile.encoding=UTF-8 smart-doc:markdown
  3. //生成adoc
  4. mvn -Dfile.encoding=UTF-8 smart-doc:adoc
  5. //生成postman json数据
  6. mvn -Dfile.encoding=UTF-8 smart-doc:postman
  7. // 生成 Open Api 3.0+, Since smart-doc-maven-plugin 1.1.5
  8. mvn -Dfile.encoding=UTF-8 smart-doc:openapi

进一步理解

结合smart-doc官方文档,我们通过几个问题进一步理解smart-doc。主要内容来源于官方文档

注释信息是有限的,smart-doc如何从注释拓展文档内容呢?

我们知道注释的信息是有限的,swagger技术栈的方式通过定义注解来约束并拓展文档中的内容,那么smart-doc如何从注释拓展文档内容呢?

一方面smart-doc的实现初衷是通过使用javadoc文档注释来去除注解式的侵入,因此smart-doc每增加一个功能首先都是去考虑javadoc原生的tag,

下面对smart-doc使用的一些javadoc的注释tag做介绍。

tag名称 使用描述
@param 对于在Spring Boot接口层,对于简单类型的参数必须在使用@param时写上注释描述,对于Entity类型smart-doc则不会检查
@deprecated 可以在注释中用于标记接口已经废弃,作用同@Deprecated注解
@apiNote @apiNoteJAVA新增的文档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用于在DubboAPI接口类上添加让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,多个参数名用空格隔开
@response smart-doc 2.2.0开始,@response tag标注在Controller方法上可以允许用这自己定义返回的json example。建议只在返回基础类型时使用,如:Result<String>类型这种泛型是简单原生类型的响应。
@tag @since 2.2.5, @tag用于将Controller方法分类, 可以将不同Contoller下的方法指定到多个分类下, 同时也可以直接指定Controller为一个分类或多个分类

Maven多模块中使用插件有没有比较好的实践?

在独立的Maven项目中使用smart-doc,当前可以说是如丝般爽滑。但是在Maven的多模块项目中使用smart-doc-maven-plugin时,很多同学就有疑问了, smart-doc插件我到底是放在什么地方合适?是放在Maven的根pom.xml中?还是说各个需要生成API接口文档的模块中呢? 下面就来说说根据不同的项目结构应该怎么放插件。

完全的父子级关系的maven项目:

  1. ├─parent
  2. ├──common
  3. pom.xml
  4. ├──web1
  5. pom.xml
  6. ├──web2
  7. pom.xml
  8. └─pom.xml

上面的maven结构假设是严格按照父子级来配置的,然后web1和web2都依赖于common, 这种情况下如果跑到web1下或者web2目录下直接执行mvn命令来编译 都是无法完成的。需要在根目录上去执行命令编译命令才能通过,而smart-doc插件会通过类加载器去加载用户配置的一些类,因此是需要调用编译的和执行命令 是一样的。这种情况下建议你建smart-doc-maven-plugin放到根pom.xml中,在web1和web2中放置各自的smart-doc.json配置。 然后通过-pl去指定让smart-doc生成指定 模块的文档。操作命令如下:

  1. # 生成web1模块的api文档
  2. mvn smart-doc:markdown -Dfile.encoding=UTF-8 -pl :web1 -am
  3. # 生成web2模块的api文档
  4. mvn smart-doc:markdown -Dfile.encoding=UTF-8 -pl :web2 -am

如果不是按照严格父子级构建的项目,还是以上面的结构例子来说。common模块放在类parent中,但是common的pom.xml并没有定义parent。 common模块也很少变更,很多公司内部可能就直接把common单独depoly上传到了公司的Nexus仓库中,这种情况下web1和web2虽然依赖于common, 但是web1和web2都可以在web1和web2目录下用命令编译,这种情况下直接将smart-doc-maven-plugin单独放到web1和web2中是可以做构建生成文档的。

多模块测试用例参考

注意: 怎么去使用插件并没有固定的模式,最重要的是熟练Maven的一些列操作,然后根据自己的项目情况来调整。技巧娴熟就能应对自如。 对于插件的使用,从smart-doc-maven-plugin 1.2.0开始,插件是能够自动分析生成模块的依赖来加载必要的源码,并不会将所有模块的接口文档合并到一个文档中。

如果生成文档时遇到问题,该如何调试?

在使用smart-doc-maven-plugin插件来构建生成API文档的过程中可能会出现一些错误问题。官方文档中提供了调试的方案:

  1. 添加smart-doc依赖

因为smart-doc-maven-plugin最终是使用smart-doc来完成项目的源码分析和文档生成的,

通常情况下真正的调试的代码是smart-doc。但这个过程主要通过smart-doc-maven-plugin来排查。

  1. <dependency>
  2. <groupId>com.github.shalousun</groupId>
  3. <artifactId>smart-doc</artifactId>
  4. <version>[最新版本]</version>
  5. <scope>test</scope>
  6. </dependency>

注意: 使用smart-doc的版本最好和插件依赖的smart-doc版本一致。

  1. 添加断点

添加断点如图所示

  1. Debug模式运行构建目标

maven插件在idea中运行debug非常简单,操作如下图。

这样就可以直接进入断点了。

提示: 上面是通过插件去作为入口调试smart-doc的源码,如果你想调试插件本身的源码执行过程,则将插件的依赖添加到项目依赖中,如下:

  1. <dependency>
  2. <groupId>com.github.shalousun</groupId>
  3. <artifactId>smart-doc-maven-plugin</artifactId>
  4. <version>【maven仓库最新版本】</version>
  5. </dependency>

然后通过上面的类似步骤调试smart-doc-maven-plugin的源码

示例源码

https://github.com/realpdai/tech-pdai-spring-demos

https://smart-doc-group.github.io/

更多内容

告别碎片化学习,无套路一站式体系化学习后端开发: Java 全栈知识体系(https://pdai.tech)

SpringBoot接口 - 如何生成接口文档之非侵入方式(通过注释生成)Smart-Doc?的更多相关文章

  1. 使用bee自动生成api文档

    beego中的bee工具可以方便的自动生成api文档,基于数据库字段,自动生成golang版基于beego的crud代码,方法如下: 1.进入到gopath目录的src下执行命令: bee api a ...

  2. PoiDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用Poi实现android中根据模板文件生成Word文档的功能.这里的模板文件是doc文件.如果模板文件是docx文件的话,请阅读 ...

  3. Maven生成项目文档

    Maven项目可以通过maven-site-plugin插件生成项目文档,无论什么项目都可以生成. 执行命令: mvn site 生成完成的输出目录在${basedir}/target/site文件夹 ...

  4. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

  5. SpringBoot+rest接口+swagger2生成API文档+validator+mybatis+aop+国际化

    代码地址:JillWen_SpringBootDemo mybatis 1. 添加依赖: <dependency> <groupId>org.mybatis.spring.bo ...

  6. 干掉 Postman?测试接口直接生成API文档,这个工具贼好用

    大家好,我是小富~ 前几天粉丝群有小伙伴问,有啥好用的API文档工具推荐,无意间发现了一款工具,这里马不停蹄的来给大家分享一下. ShowDoc一个非常适合团队的在线API文档工具,也支持用docke ...

  7. 干掉 Postman?测试接口直接生成API文档,ApiPost真香!

    实不相瞒我的收藏夹里躺着很多优质的开发工具,我有个爱好平时遇到感兴趣的开发工具都会记录下来,然后有时间在慢慢研究.前几天刚给同事分享一款非常好用的API文档工具,真的被惊艳到了,粉丝朋友们也感受一下吧 ...

  8. SpringBoot系列: 使用 Swagger 生成 API 文档

    SpringBoot非常适合开发 Restful API程序, 我们都知道为API文档非常重要, 但要维护好难度也很大, 原因有: 1. API文档如何能被方便地找到? 以文件的形式编写API文档都有 ...

  9. springboot 集成 swagger 自动生成API文档

    Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.简单来说,Swagger是一个功能强大的接口管理工具,并且提供了多种编程语言的前后端分离解决方案. S ...

随机推荐

  1. 数据结构_C语言_单链表

    # include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...

  2. MybatisPlus常用注解

    一.@TableName value属性 实体类的名字是User,数据库表名是t_user @TableName(value = "t_user") public class Us ...

  3. 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口

    前言   上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...

  4. Java注解Annotaton

    1.三种基本的Annotaton @Override : 限定某个方法,是重写父类方法 , 该注解只能用于方法 @Deprecated : 用于表示某个程序元素 ( 类 , 方法等 ) 已过时 @Su ...

  5. 【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示

    前言: Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了.用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架.依赖属性(Dependen ...

  6. 893. Groups of Special-Equivalent Strings - LeetCode

    Question 893. Groups of Special-Equivalent Strings Solution 题目大意: AB两个字符串相等的条件是:A中偶数位出现的字符与B中偶数位出现的字 ...

  7. 安装Iftop到CentOS(YUM)

    iftop是Linux系统下实时流量监控工具. 运行环境 系统版本:CentOS Linux release 7.6.1810 (Core) 软件版本:Python 硬件要求:无 安装过程 1.安装i ...

  8. MAC M1安装多个JDK版本及动态切换

    JDK版本下载 下载地址:https://www.azul.com/downloads/?package=jdk 筛选一下macOS的ARM 64-bit架构的JDK版本,下载对应版本即可.最好直接下 ...

  9. 一些实验中用过的python函数/方法(持续更新)

    衡量运行时间 很多时候你需要计算某段代码执行所需的时间,可以使用 time 模块来实现这个功能. import time startTime = time.time() # write your co ...

  10. 关于『Markdown』:第一弹

    关于『Markdown』:第一弹 建议缩放90%食用 声明: 在我之前已有数位大佬发布 "Markdown" 的语法知识点, 在此, 仅整理归类以及补缺, 方便阅读. 感谢 C20 ...