大家都知道Swagger是一个常用的Spring Boot接口文档生成工具,但是我们今天再介绍另外一个无需额外注解的 Spring Boot API文档生成神器,非常方便好用!

JApiDocs是一个无需额外注解、开箱即用的Spring Boot接口文档生成工具。

编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又不得不做的事情,我们都不喜欢写文档,但除非项目前后端代码都是自己写的,否则API文档将是前后端协作中一个不可或缺的沟通界面。既然不可避免,那就想办法弄个轮子吧。人生苦短,必须偷懒。

无图无真相,生成文档的效果如下:

相比Swagger要写一堆注解,Spring RestDocs需要写测试用例,才能生成API文档。JApiDocs 具有无痛集成的特点,你只需花几分钟就能知道它怎么用了。

入门

支持JDK:1.8+

快速开始

第一步:添加依赖

maven:

  1. <dependency>
  2. <groupId>io.github.yedaxia</groupId>
  3. <artifactId>japidocs</artifactId>
  4. <version>1.4.4</version>
  5. </dependency>

gradle:

  1. compile 'io.github.yedaxia:japidocs:1.4.4'

第二步:配置参数

你可以在任意一个main入口运行下面的代码:

  1. DocsConfig config = new DocsConfig();
  2. config.setProjectPath("your springboot project path"); // 项目根目录
  3. config.setProjectName("ProjectName"); // 项目名称
  4. config.setApiVersion("V1.0"); // 声明该API的版本
  5. config.setDocsPath("your api docs path"); // 生成API 文档所在目录
  6. config.setAutoGenerate(Boolean.TRUE); // 配置自动生成
  7. Docs.buildHtmlDocs(config); // 执行生成文档

如果没有意外,执行完上面的代码后,你就可以在配置的目录中看到生成的文档了。

编码规范

JApiDocs是通过解析Java源码来实现的,要使得JApiDocs正确工作,需要你在项目中的Controller书写遵循一定的编码规范。

你可以结合源码中 SpringDemo 这个模块来对照理解。

1. 添加必要的代码注释

其中类注释会对应到一级接口分组,你也可以通过@description来指定分组名称;JApiDocs 会通过 @param 来寻找接口参数和进一步解析参数的内容。

  1. /**
  2. * 用户接口
  3. */
  4. @RequestMapping("/api/user/")
  5. @RestController
  6. public class UserController {
  7. /**
  8. * 用户列表
  9. * @param listForm
  10. */
  11. @RequestMapping(path = "list", method = {RequestMethod.GET, RequestMethod.POST} )
  12. public ApiResult<PageResult<UserVO>> list(UserListForm listForm){
  13. return null;
  14. }
  15. /**
  16. * 保存用户
  17. * @param userForm
  18. */
  19. @PostMapping(path = "save")
  20. public ApiResult<UserVO> saveUser(@RequestBody UserForm userForm){
  21. return null;
  22. }
  23. /**
  24. * 删除用户
  25. * @param userId 用户ID
  26. */
  27. @PostMapping("delete")
  28. public ApiResult deleteUser(@RequestParam Long userId){
  29. return null;
  30. }
  31. }

如果提交的表单是 application/x-www-form-urlencoded 类型的key/value格式,你可以在 SpringBoot 端通过在 @param 参数后添加字段解释或者在相关的JavaBean对象里面添加解释:

  1. // 直接在java的 @param 注解中
  2. @param userId 用户ID
  1. // 在FormBean对象中
  2. public class UserListForm extends PageForm{
  3. private Integer status; //用户状态
  4. private String name; //用户名
  5. }

这种格式对于到文档中的参数描述将是表格的形式:

参数名 类型 必须 描述
status int 用户状态
name string 用户名

如果提交的表单是 application/json 类型的json数据格式,对应 SpringBoot 中的 @RequestBody 注解,在文档中则是 json 格式显示:

  1. {
  2. "id": "long //用户ID",
  3. "name": "string //用户名",
  4. "phone": "long //电话",
  5. "avatar": "string //头像",
  6. "gender": "byte //性别"
  7. }

2. 接口声明返回对象

我们知道,如果Controller声明了@RestController,SpringBoot会把返回的对象直接序列成Json数据格式返回给前端。

JApiDocs也利用了这一特性来解析接口返回的结果,但由于JApiDocs是静态解析源码的,因此你要明确指出返回对象的类型信息,JApiDocs支持继承、泛型、循环嵌套等复杂的类解析。

比如上面的saveUser接口:

  1. /**
  2. * 保存用户
  3. * @param userForm
  4. */
  5. @PostMapping(path = "save")
  6. public ApiResult<UserVO> saveUser(@RequestBody UserForm userForm){
  7. return null;
  8. }

ApiResult<UserVO>表明了该接口返回的数据结构,经过JApiDocs处理后是这样的:

  1. {
  2. "code": "int",
  3. "errMsg": "string",
  4. "data": {
  5. "userId": "string //用户id",
  6. "userName": "string //用户名",
  7. "friends": [
  8. {
  9. "userId": "string //用户id",
  10. "userName": "string //用户名"
  11. }
  12. ],
  13. "readBooks": [
  14. {
  15. "bookId": "long //图书id",
  16. "bookName": "string //图书名称"
  17. }
  18. ],
  19. "isFollow": "boolean //是否关注"
  20. }
  21. }

如果你不是通过返回对象的形式,你也可以通过JApiDocs提供的@ApiDoc注解来声明返回类型,你可以参考@ApiDoc章节的相关配置内容。

3. 接口对象在源码中

我们知道,经过编译后的 class 字节码中是没有注释信息的。所以为了让JApiDcos能更好地工作,你的表单Bean类和返回类最好在源码中,否则生成的文档将会缺失说明信息。

在1.4.2版本中,JApiDocs在找不到源码的情况下(依赖类在jar包中)也会通过尝试反射的方式来解析字段信息,但这样就没有说明信息了。

后续会计划通过关联源码的形式来解决这个问题。

高级配置

@ApiDoc

JApiDocs 默认只导出声明了@ApiDoc的接口,我们前面通过设置 config.setAutoGenerate(Boolean.TRUE) 来解除了这个限制。

如果你不希望把所有的接口都导出,你可以把autoGenerate设置关闭,在相关Controller类或者接口方法上通过添加@ApiDoc来确定哪些接口需要导出。

@ApiDoc声明在接口方法上的时候,它还拥有一些更灵活的设置,下面我们来看一下:

  • result: 这个可以直接声明返回的对象类型,如果你声明了,将会覆盖SpringBoot的返回对象
  • stringResult:返回字符串,在返回结果比较简单,而不想创建一个专门的返回类,则可以考虑使用这个属性。
  • url: 请求URL,扩展字段,用于支持非SpringBoot项目
  • method: 请求方法,扩展字段,用于支持非SpringBoot项目

例子:

  1. @ApiDoc(result = AdminVO.class, url = "/api/v1/admin/login2", method = "post")

stringResult 实例,在文档中将会自动格式化json字符串:

  1. @ApiDoc(stringResult = "{code: 0, data: 'success'}")
  2. @GetMapping(value = "custom-json")
  3. public Map customJsonResult(){}

@Ignore

忽略Controller

你只需要在Controller类上添加该注解即可,这样,整个Controller的接口都会被忽略掉:


  1. @Ignore
  2. public class UserController {
  3. }

忽略接口

不难理解,就是在接口方法中添加@Ignore注解:


  1. @Ignore
  2. @PostMapping("save")
  3. public ApiResult saveUser(){
  4. return null;
  5. }

忽略字段

如果你不想导出对象里面的某个字段,可以给这个字段加上@Ignore注解,这样JApiDocs导出文档的时候就会自动忽略掉了:

例子:

  1. public class UserForm{
  2. @Ignore
  3. private Byte gender; //性别
  4. }

@description

在Controller类上使用

在类上使用@description,将会作为该Controller在文档上的导航标题,而不会使用上面的注释内容。

  1. /**
  2. * 演示一些比较特殊的声明方法
  3. *
  4. * @description 管理员接口
  5. * @author yeguozhong yedaxia.github.com
  6. */
  7. @Controller
  8. public class AdminController {

在接口方法上使用

在方法中使用,则可以在接口方法下面添加一行说明:

  1. /**
  2. * 用户列表
  3. * @description 这是一行说明
  4. * @param listForm
  5. * @author yedaxia
  6. */
  7. @RequestMapping(path = "list", method = {RequestMethod.GET, RequestMethod.POST} )
  8. public ApiResult<PageResult<UserVO>> list(UserListForm listForm){}

导出更多格式

导出markdown

  1. config.addPlugin(new MarkdownDocPlugin());

导出 pdf 或者 word

你可以通过 pandoc 把 markdown 格式转成 pdf 或者 word 格式。

自定义代码模板

JApiDocs 除了支持文档导出,目前也支持生成了 Android 和 iOS 的返回对象代码,对应 Java 和 Object-C 语言,

如果你想修改代码模板,可以通过以下的方法:

第一步:定义代码模板

把源码中library项目resources目录下的代码模板拷贝一份,其中,IOS_表示 Object-C 代码模板,JAVA_开头表示 Java代码,

模板中类似${CLASS_NAME}的符号是替换变量,具体含义你可以结合生成的代码进行理解,然后按照你想要的代码模板进行修改即可。

第二步:选择新的模板

通过DocsConfig配置模板路径替换成新的模板:

  1. docsConfig.setResourcePath("模板路径");

添加更多功能

JApiDocs 提供了插件接口,你可以通过插件接口来实现更多丰富的功能,下面介绍如何添加插件:

第一步:实现 IPluginSupport 接口

  1. public class CustomPlugin implements IPluginSupport{
  2. @Override
  3. public void execute(List<ControllerNode> controllerNodeList){
  4. // 实现你自己的功能需求
  5. }
  6. }

第二步:添加插件

  1. config.addPlugin(new CustomPlugin());

常见问题

1、如何排查错误?

关闭自动生成config.setAutoGenerate(Boolean.FALSE),使用@ApiDoc 来一个个接口导出排查问题。

2、多模块找不到相关类源码?

如果源码路径没有全部识别出来,可以通过config.addJavaSrcPath来添加模块的源码路径,注意要添加到src/main/java这一级。

知道的越多不知道的更多

老公 今晚还玩“丝袜哥”Swagger 么?的更多相关文章

  1. 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)

    概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...

  2. 【AS3 Coder】任务八:没剧情还玩毛RPG

    使用框架:AS3任务描述:了解RPG游戏中剧情播放器的制作原理及流程难度系数:3(了解原理,能根据XML文件播放剧情) / 5(会制作剧情编辑器) 本章源码下载:http://www.iamseven ...

  3. 今晚,玩一玩linux上的DNS

    老哥遇到的问题, 我先按正规方式操作一波. 一,安装dns服务 yum install bind bind-utils -y 二,修改/etc/named.conf文件 options { liste ...

  4. 【Swagger】可能是目前最好的 Spring Boot 集成 swagger 的方案

    [Swagger]可能是目前最好的Spring Boot集成 swagger 的方案 ![](https://img2018.cnblogs.com/blog/746311/201909/746311 ...

  5. Swagger从入门到精通

    https://legacy.gitbook.com/book/huangwenchao/swagger/details 如何编写基于OpenAPI规范的API文档 [TOC] 前言 编写目的 本文介 ...

  6. webapi文档描述-swagger

    最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员,最初打算使用word文档方式进行交流 ...

  7. 在WebApi中 集成 Swagger

    1. Swagger(俗称:丝袜哥)是什么东西? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同 ...

  8. WebApi 集成 Swagger

    1. Swagger(俗称:丝袜哥)是什么东西? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同 ...

  9. 关于电脑玩MT以及多开的方法

    方法是转的别人的首先感谢原创者!!上四开屏幕截图,因为小伙伴需要8张卡,所以我四个四个一起练.8开我的电脑估计都有压力,五开六开可能没问题,但是为了方便就四开,练完四个再练四个.图接下来说下多开模拟器 ...

随机推荐

  1. 如何实现一个 System Services?

    <Android 系统开发做什么?>写到 Android System Services 是专注于特定功能的模块化组件,应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件.An ...

  2. LinkedList作为栈和队列的使用

    最近在LeekCode用java写一些算法时,经常遇到要使用栈和队列结构,使用栈的话,Stack已经不被推荐使用了,所以栈和队列我们通常都是用LinkedList这种双链表结构实现.Linkedlis ...

  3. 没有发生GC也进入了安全点?这段关于安全点的JVM源码有点意思!

    文末 JVM 思维导图,有需要的可以自取 熟知并发编程的你认为下面这段代码的执行结果是怎么样的? 我如果说,执行流程是: t1 线程和 t2 线程一直执行 num 的累加操作 主线程睡眠 1 秒,1 ...

  4. 一文搞懂spring的常用注解

    spring传统做法是使用xml文件对bean进行注入和配置.通过使用spring提供的注解,可以极大的降低配置xml文件的繁琐.本文将介绍常用的注解. 一@Autowired Autowired意为 ...

  5. xl release 安装

    前提,该版本需要jdk-1.8以上(包括1.8),内存大于等于2G,磁盘最小空间2G,操作系统windows或者unix-family xl release是一个端到端的管道编排工具. 下载XL-re ...

  6. 【转载】 Linux常用命令: zip、unzip 压缩和解压缩命令

    Linux常用命令: zip.unzip 压缩和解压缩命令   Linux常用命令: zip.unzip 压缩和解压缩命令 zip的用法 基本用法是: zip [参数] [打包后的文件名] [打包的目 ...

  7. 用urllib库几行代码实现最简单爬虫

    """ 使用urllib.request()请求一个网页内容,并且把内容打印出来. """ from urllib import reque ...

  8. 运维常用shell脚本一(系统指标巡检、自动创建用户、跳板机)

    一.系统指标巡检脚本 #!/bin/bash menu(){ cat <<EOF +---------------------------------------------+ | 日常巡 ...

  9. linux中级之netfilter防火墙(firewalld)

    一.firewalld主要概念 dynamic firewall daemon.支持ipv4和ipv6.Centos7中默认将防火墙从iptables升级为了firewalld.firewalld相对 ...

  10. Lua中的异常处理pcall、xpcall、debug使用实例

    如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码. pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误.无错误:返回值true或 ...