入门

支持JDK:1.8+

快速开始

第一步:添加依赖

maven:

io.github.yedaxia

japidocs

1.4.3

gradle:

compile 'io.github.yedaxia:japidocs:1.4.3'

第二步:配置参数

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

DocsConfig config = new DocsConfig();

config.setProjectPath("your springboot project path"); // 项目根目录

config.setProjectName("ProjectName"); // 项目名称

config.setApiVersion("V1.0"); // 声明该API的版本

config.setDocsPath("your api docs path"); // 生成API 文档所在目录

config.setAutoGenerate(Boolean.TRUE); // 配置自动生成

Docs.buildHtmlDocs(config); // 执行生成文档

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

编码规范

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

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

1. 添加必要的代码注释

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

/**

* 用户接口

*/

@RequestMapping("/api/user/")

@RestController

public class UserController {

/**

* 用户列表

* @param listForm

*/

@RequestMapping(path = "list", method = {RequestMethod.GET, RequestMethod.POST} )

public ApiResult> list(UserListForm listForm){

return null;

}

/**

* 保存用户

* @param userForm

*/

@PostMapping(path = "save")

public ApiResult saveUser(@RequestBody UserForm userForm){

return null;

}

/**

* 删除用户

* @param userId 用户ID

*/

@PostMapping("delete")

public ApiResult deleteUser(@RequestParam Long userId){

return null;

}

}

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

// 直接在java的 @param 注解中

@param userId 用户ID

// 在FormBean对象中

public class UserListForm extends PageForm{

private Integer status; //用户状态

private String name; //用户名

}

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

参数名

类型

必须

描述

status

int

用户状态

name

string

用户名

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

{

"id": "long //用户ID",

"name": "string //用户名",

"phone": "long //电话",

"avatar": "string //头像",

"gender": "byte //性别"

}

2.接口声明返回对象

我们知道,如果Controller声明了@RestController,SpringBoot会把返回的对象直接序列成Json数据格式返回给前端。 JApiDocs也利用了这一特性来解析接口返回的结果,但由于JApiDocs是静态解析源码的,因此你要明确指出返回对象的类型信息,JApiDocs支持继承、泛型、循环嵌套等复杂的类解析。

比如上面的saveUser接口:

/**

* 保存用户

* @param userForm

*/

@PostMapping(path = "save")

public ApiResult saveUser(@RequestBody UserForm userForm){

return null;

}

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

{

"code": "int",

"errMsg": "string",

"data": {

"userId": "string //用户id",

"userName": "string //用户名",

"friends": [

{

"userId": "string //用户id",

"userName": "string //用户名"

}

],

"readBooks": [

{

"bookId": "long //图书id",

"bookName": "string //图书名称"

}

],

"isFollow": "boolean //是否关注"

}

}

如果你不是通过返回对象的形式,你也可以通过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项目

例子:

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

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

@ApiDoc(stringResult = "{code: 0, data: 'success'}")

@GetMapping(value = "custom-json")

public Map customJsonResult(){}

@Ignore

忽略Controller

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

@Ignore

public class UserController {

}

忽略接口

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

@Ignore

@PostMapping("save")

public ApiResult saveUser(){

return null;

}

忽略字段

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

例子:

public class UserForm{

@Ignore

private Byte gender; //性别

}

@description

在Controller类上使用

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

/**

* 演示一些比较特殊的声明方法

*

* @description 管理员接口

* @author yeguozhong yedaxia.github.com

*/

@Controller

public class AdminController {

在接口方法上使用

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

/**

* 用户列表

* @description 这是一行说明

* @param listForm

* @author yedaxia

*/

@RequestMapping(path = "list", method = {RequestMethod.GET, RequestMethod.POST} )

public ApiResult> list(UserListForm listForm){}

导出更多格式

导出markdown

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配置模板路径替换成新的模板:

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

添加更多功能

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

第一步:实现 IPluginSupport 接口

public class CustomPlugin implements IPluginSupport{

@Override

public void execute(List controllerNodeList){

// 实现你自己的功能需求

}

}

第二步:添加插件

config.addPlugin(new CustomPlugin());

常见问题

1、如何排查错误?

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

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

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

java文档注释生产api没有注释_一个神奇的没有springboot注释的api文档生成器---JApiDocs...相关推荐

  1. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  2. java api管理工具_一个能快速写出实体类的Api文档管理工具

    今天各种MVC框架满天飞,大大降低了编码的难度,写实体类就没有办法回避的一件事了,花大把的时间去做一些重复而且繁琐的工作,实在不是一个优秀程序员的作风,所以多次查找和尝试后,找到一个工具类网站--Ap ...

  3. java基于ssm的个人博客系统_一个基于 Spring Boot 的开源免费博客系统

    概况 mblog 开源免费的博客系统, Java 语言开发, 支持 mysql/h2 数据库, 采用 spring-boot.jpa.shiro.bootstrap 等流行框架开发.支持多用户, 支持 ...

  4. JAVA程序中怎么看线程的个数_一个文件中有10000个数,用Java实现一个多线程程序将这...

    18 推荐 运行结果: 编辑于 2015-07-16 17:20:57 回复(11) 12 自己重写了一下推荐答案,加了些注释方便理解 package threadpackage; import ja ...

  5. rest api封装调用_如何从云功能调用外部REST API

    rest api封装调用 在之前的博客文章中,我展示了如何创建您的第一个云功能 (以及一个视频 ). 您的云函数很可能需要调用外部REST API. 以下教程将向您展示如何创建此类功能(非常简单). ...

  6. java中实现接口采用的关键字是_一个Java类实现一个接口使用的是implements关键字。...

    个用务人为是导致的债的行销权可能债权人行使撤. 无关调制信号它与及电方式速率,类实务的新业宽带也是引入方便手段,在网展中络发,想的扩容是理手段. 个接s关标志牌的要求水线设置. 的受定期通信预算资格建 ...

  7. java文档注释生产api没有注释_如何使用javadoc命令生成api文档,文档注释

    /** * 计算器工具类 * * @62616964757a686964616fe78988e69d8331333365646332author GaoHuanjie * @version V1.0 ...

  8. 让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性

    文章目录 单行和多行注释 文档注释(Java特有) Annotation(注解)的理解 常见的Annotation示例 IDEA注释注解快捷键及模板 自定义 Annotation JDK 中的元注解 ...

  9. 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

    大数据技术之_20_Elasticsearch学习_01 一 概述 1.1 什么是搜索? 1.2 如果用数据库做搜索会怎么样? 1.3 什么是全文检索和 Lucene? 1.4 什么是 Elastic ...

最新文章

  1. matrix_multiply代码解析
  2. 源码之HashMap
  3. python四大软件-9个使用Python的世界级软件公司
  4. placeholder如何实现换行
  5. [ckeditor系列]ckeditor 自己写的一个简单的image上传js 运用iframe的ajax上传
  6. 设计师妹子问:字体颜色渐变,你能实现?
  7. 中国邮路问题邮递员问题欧拉路径图论C++
  8. 几个经常用到的字符串的截取(java)
  9. 清明上河图 HTML 代码
  10. 工作站Linux双显卡BIOS设置,在BIOS Setup里面设置双显卡机型的双显卡模式常见方式介绍...
  11. 前端JS项目实战——瀑布流
  12. 几年基础架构的经验之谈[42 things I learned from building a production database]
  13. 安卓机自动肝手游脚本
  14. FTP bin和ascii的区别
  15. H5架设新手小白搭建教程(适用于新手)
  16. 耳机是如何是发出声音的?
  17. Coursera | Andrew Ng (02-week-1-1.7)—理解 Dropout
  18. MAC 活动监视器部分状态缺失
  19. Java电商系统秒杀怎么做?
  20. IOST节点计划全面升级: 全球寻找1000位IOST合伙人

热门文章

  1. 目标检测之选择性搜索-Selective Search
  2. 区块链技术的五大颠覆性价值
  3. 将本地文件上传至Github【详细步骤】
  4. 列一下OOP规约,编程的时候共勉!别踏坑!
  5. C++ iterator迭代器
  6. 网络协议之:一定要大写的SOCKS
  7. 在nodejs中创建cluster
  8. java中线程的生命周期
  9. 分布式网站架构后续:zookeeper技术浅析
  10. mysql修改字段名称_MySQL增删改查的常用语句汇总