说明

维护过项目的人应该都有体会, 如果接口文档是单独编写的(org-mode、markdown、rap 甚至是 word 等),

随着项目周期的推进, 接口文档和真实代码之间的差距会越来越远.

基于 swagger 的一些细节不那么让人如意(比如无法处理 map, swagger-ui 中查看响应说明需要切屏, 把脑袋理解成是一台计算机, 眼睛是输入设备,

在看到返回的 json 时, 眼球会自己 parse 成对应的对象, 这时候你还无法确定各个字段的说明, 得切屏才能知道, 脑子会想办法把两者关联起来,

但是同一时间只能看到一个, 且切屏后的说明跟原来的排列并不一致, 于是只能不停的切, 这会加重将两者关联起来的心智负担)而出现了此文档收集应用.

使用

添加引用

com.github.liuanxin

api-document

0.8.1

添加配置

@Configuration

@EnableApiInfo

public class ApiInfoConfig {

// 可以在不同的 profile 中设置不同的值, 如:

// application.yml => online: false

// application-test.yml => online: false

// application-prod.yml => online: true

@Value("${online:false}")

private boolean online;

@Bean

public DocumentCopyright apiCopyright() {

return new DocumentCopyright("标题", "团队", "版本号", "版权")

// // true 则不进行文档收集, 默认是 false

// .setOnline(online)

// // 当某些接口不好标 @ApiIgnore 时(格式: url|method, url 可以使用 * 通配 method 可以忽略)

// .setIgnoreUrlSet(Sets.newHashSet("/user*", "/product/info|post"))

// // 全局的响应说明, 如果类或方法上有 @ApiResponses 则以它们为准

// .setGlobalResponse(Arrays.asList(

// new DocumentResponse(400, "参数有误"),

// new DocumentResponse(500, "请求异常").setResponse(XXX.class) // 见 @ApiReturnType 示例说明

// ))

// // 全局 token, 这个配置会生成在每个接口的参数中,

// // 如果想在具体的接口上忽略这些配置 或者 设置不同的参数 请使用 @ApiTokens 注解

// .setGlobalTokens(Arrays.asList(

// DocumentParam.buildToken("x-token", "认证数据", "abc", ParamType.Header).setHasTextarea("1"),

// DocumentParam.buildToken("x-version", "接口版本", "1.0.0", ParamType.Query).setMust("1")

// ))

// // 字段说明是否输出在返回示例中, 不设置则默认是 true,

// // 设置为 false 将会单独罗列, 方法上标了则以方法上的为准

// .setCommentInReturnExample(false)

// // 用在多文档收集, 是否将项目合并后输出, 默认是 false

// // 如果为 true, 请务必保证所有项目的全局响应说明和全局 token 是一致的,

// // 附加在一起并去重(当前做法)可能会导致文档错误;

// // -----

// // 如果是 false, 将在页面上选择项目进行请求, 请务必保证设置的项目都开启了 cors,

// // 否则将会因为跨域问题导致无法访问

// .setProjectMerge(true)

// // 收集其他项目的文档

// .setProjectMap(new LinkedHashMap() {{

// // key 格式: 名称-说明, 如: user-用户. value 是项目地址, 如: http://ip:port

// put("user-用户", "http://ip:port/user");

// put("product-商品", "http://ip:port/product");

// }})

;

}

}

而后在对应的 controller 层标注相应的注解(只对 @RestController 或 @ResponseBody 相关的类及接口进行文档收集,

如果方法上的返回类型是 List、Set 或 Map 会以 ArrayList、HashSet 及 HashMap 进行处理),

ResponseEntity 或 Callable 或 DeferredResult 或 WebAsyncTask 会处理其定义的泛型类型(不设置将无法解析)

PS: 可以参考 示例项目(spring boot 2) 的全局处理.

泛型请务必使用确切的类型, 如 等, 如果使用 这样的类型将会无法解析.

@SpringBootApplication

public class ExampleApplication {

public static void main(String[] args) {

SpringApplication.run(ExampleApplication.class, args);

}

}

@ApiGroup("example-示例")

@RestController

public class ExampleController {

@ApiMethod("用户列表")

@GetMapping("/example")

public JsonResult> example(@ApiParam("类型") String type, Page page) {

return JsonResult.success("示例接口", Arrays.asList(new DemoVo()));

}

}

@Data

public class Page {

@ApiParam("当前页数")

private Integer page;

@ApiParam("每页条数")

private Integer limit;

...

}

@Data

public class JsonResult {

@ApiReturn("返回码")

private JsonCode code;

@ApiReturn("返回说明")

private String msg;

@ApiReturn("返回数据")

@JsonInclude(JsonInclude.Include.NON_NULL)

private T data;

...

}

public enum JsonCode {

SUCCESS(200, "成功"),

NOT_LOGIN(401, "未登录"),

FAIL(500, "内部错误或业务异常");

int code;

String value;

JsonCode(int code, String value) {

this.code = code;

this.value = value;

}

...

}

@Data

public class DemoVo {

private Long id;

@ApiReturn("名称")

private String name;

...

}

注解说明

@ApiGroup --> 标注在类或方法上. 表示当前接口隶属哪个模块. 如果类上和方法上都标了则以方法上的为准

value --> 模块说明. 必须设置, 示例(名称-说明, 如: user-用户, 名称用来生成锚点,

说明用来显示, 以 英文中横线 - 隔开, 说明如果为空则显示成名称)

index --> 索引, 可以不设置, 越小越靠前. 可以不设置(索引如果一致会使用 说明 排序,

说明如果也一致会使用 名称 排序), 同一模块在不同的地方标注且索引不同时, 以小的索引为主

@ApiResponses --> 标注在类或方法上. 用来标注接口的响应码或描述

value --> @ApiResponse[], 必须设置

@ApiResponse --> 嵌套注解

code --> 响应码, 必须设置, 如 400

msg --> 响应说明, 必须设置, 如 参数不正确

type --> 嵌套注解 @ApiReturnType[] 定义返回类型, 可以不设置

示例如下:

@ApiResponses({ // 标注在类或接口上表示相关的接口会返回指定的响应, 否则会走全局的响应配置

@ApiResponse(code = 400, msg = "参数有误", type = { @ApiReturnType(XXX.class }),

@ApiResponse(code = 500, msg = "请求异常")

})

@ApiReturnType --> 嵌套注解, 用在 @ApiResponse 或 @ApiMethod 中

value --> 返回类型, 必须设置

generic --> 返回类型的泛型类型, 可以不设置

genericParent --> 返回类型中泛型类型的父层级, 可以不设置

genericChild --> 返回类型的泛型类型的子层级, 可以不设置

示例如下:

XXX ==> @ApiReturnType(XXX.class)

List ==> @ApiReturnType(value = List.class, generic = XXX.class)

Set ==> @ApiReturnType(value = Set.class, generic = XXX.class)

Map ==> @ApiReturnType(value = Map.class, generic = { String.class, XXX.class })

JsonResult ==> @ApiReturnType(value = JsonResult.class, generic = XXX.class)

JsonResult> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = List.class,

generic = XXX.class

)

JsonResult> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = Set.class,

generic = XXX.class

)

JsonResult> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = Map.class,

generic = { String.class, XXX.class }

)

JsonResult> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = YYY.class,

generic = XXX.class

)

JsonResult>> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = YYY.class,

generic = List.class,

genericChild = XXX.class

)

JsonResult>> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = YYY.class,

generic = Set.class,

genericChild = XXX.class

)

JsonResult>> ==> @ApiReturnType(

value = JsonResult.class,

genericParent = YYY.class,

generic = Map.class,

genericChild = { String.class, XXX.class }

)

@ApiMethod --> 标注在方法上

value --> 接口标题, 必须设置

develop --> 开发者信息, 可以不设置

desc --> 接口详细说明. 可以不设置

index --> 索引, 越小越靠前. 可以不设置(索引如果一致会使用 开发者信息 排序,

开发者信息 如果也一致会使用 接口标题 排序)

commentInReturnExample --> 返回字段说明是否写在返回示例中, 可以不设置,

如果设置为 false 所有的字段说明将会在返回示例的下面单独罗列.

不设置则以全局设置为准

returnType --> 嵌套注解 @ApiReturnType[] 自定义返回类型, 可以不设置, 如果设置将忽略方法上的返回类型

@ApiIgnore --> 标注在类或方法上. 当想要在某个类或接口上忽略收集时, 使用此注释

value --> 值如果是 false 则表示不忽略. 类上和方法上都标了则以方法上的为准

@ApiParam --> 标注在参数上(如果参数是由实体注入的, 则在实体的字段上标注)

value --> 参数说明, 可以不设置

name --> 参数名, 可以不设置, 如果设置了将会无视参数名或字段名

dataType --> 数据类型. 可以不设置, 自定义时(比如参数类型是枚举,

但是显示在文档上时可以传 int 时)有用: int、long、float、double、date、phone、email、url、ipv4

example --> 参数示例. 用在接口示例时有用, 可以不设置

paramType --> 参数类型. 可以不设置, Header 或 Query 两种, 默认是 Query

must --> 参数是否必须. 可以不设置, 如果标有 @RequestParam(required = true) etc... 则无视此设置

textarea --> 参数是否显示成文本域, 可以不设置, 默认是 false

datePattern --> 时间格式. 可以不设置, 如: yyyy-MM-dd HH:mm:ss

style --> 参数在页面上的样式, 可以不设置, 如: color:green;height:35px;

@ApiParamIgnore --> 标注在参数上(如果参数是由实体注入的, 则在实体的字段上标注). 如果不希望参数出现在文档中, 使用此注解

@ApiReturn --> 标注在字段上. 用来说明返回结果

value --> 返回说明, 可以不设置

name --> 返回名称, 可以不设置, 如果设置了将忽略字段名, 如果有用到 @JsonProperty 则使用其设置的值

type --> 返回类型, 可以不设置, 自定义(比如字段类型是枚举, 但是显示在文档上时是 int 时)用到

example --> 返回示例, 可以不设置, 只用在字段是 String 或基础数据类型(包括 BigInteger 和 BigDecimal)上

@ApiReturnIgnore --> 标注在字段上. 如果不希望返回字段出现在结果文档中, 使用此注解, 在字段上标注 @JsonIgnore 也是一样的

@ApiTokens --> 标注在类或方法上

useGlobal --> 是否使用全局 token, 可以不设置, 默认是 false

value --> @ApiToken[], 可以不设置, 表示当前接口需要传递的 token 信息

@ApiToken --> 嵌套注解

name --> 参数名. 必须设置

desc --> 参数说明. 可以不设置

example --> 参数示例. 用在接口示例时有用, 可以不设置

dataType --> 参数类型. 可以不设置. 如: int、long、float、double、date、phone、email、url、ipv4

paramType --> 参数类型. 可以不设置. Header 或 Query 两种, 默认是 Header

must --> 参数是否必须. 可以不设置, 默认是 false

textarea --> 参数是否显示成文本域, 用在接口示例时有用, 可以不设置, 默认是 false

datePattern --> 参数类型是 date 时的时间格式. 可以不设置, 如: yyyy-MM-dd HH:mm:ss

style --> 参数在页面上 的样式, 可以不设置

示例如下:

@ApiTokens // 标注在类或接口上表示相关的接口将不会生成全局的 token 信息

@ApiTokens({ // 标注在类或接口上表示相关的接口将会使用参数中指定的 token 信息

@ApiToken(name = "x-token", desc = "认证数据", example = "abc-xyz", textarea = true),

@ApiToken(name = "x-version", desc = "接口版本", example = "1.0", paramType = ParamType.Query, must = true)

})

@ApiModel --> 结合了 @ApiParam 和 @ApiReturn 两个注解的注解,

可以同时说明请求参数和返回字段, 请不要滥用, 应该尽量用前两者

value --> 返回或参数说明, 可以不设置

name --> 返回或参数名, 可以不设置, 如果设置了将会无视参数名或字段名

dataType --> 返回或参数的数据类型. 可以不设置, 自定义时有用: int、long、float、double、date、phone、email、url、ipv4

example --> 返回或参数的示例. 用在接口示例时有用, 可以不设置

-- 上面的属性同时作用在 请求参数 和 返回字段 上, 下面的属性只用在 请求参数 上

paramType --> 参数类型. 可以不设置, Header 或 Query 两种, 默认是 Query

must --> 参数是否必须. 可以不设置, 如果标有 @RequestParam(required = true) etc... 则无视此设置

textarea --> 参数是否显示成文本域, 可以不设置, 默认是 false

datePattern --> 时间格式. 可以不设置, 如: YYYY-MM-DD HH:mm:ss

style --> 参数在页面上的样式, 可以不设置, 如: color:green;height:35px;

如果是非 spring boot 项目, 添加如下配置

运行项目, 访问页面 http://ip:port/static/api-info.html (spring boot 则不需要 /static 二级目录)

页面 http://ip:port/static/api-info-example.html 直接请求后台接口

字段说明不显示在返回示例中, 单独罗列

document api java_GitHub - liuanxin/api-document: java spring-mvc document collect相关推荐

  1. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

  2. Java Spring MVC分层设计

    Java Spring MVC分层设计 第一次尝试着用Java做Web开发,使用了Java Spring框架,顺便说一句,如果使用Spring开发,建议使用STS(Spring Tool Suite) ...

  3. B2C商城项目源码,基于Java开发的高可用分布式B2C商城系统,Java+Spring MVC+Dubbo+Zookeeper+MySQL+Redis+FastDFS+Nginx+Solr

    目录 前言 B2C商城-AIYOU 一.项目总体架构 二.系统软硬件设施总体规划 1.系统服务规划 2.应用服务规划 3.应用系统域名规划 三.系统运行环境构建 四.项目数据库创建 五.项目拉取 六. ...

  4. Java Spring MVC框架 VIII 之 Spring MVC拦截器

    Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...

  5. Java Spring MVC框架 VII

    Java Spring MVC框架 VII Spring MVC小结 1.小结 ● 关于Spring MVC框架,你应该(1/5): – 理解Spring MVC框架的作用 – 接收请求,响应结果,处 ...

  6. java spring mvc api_SpringMVC实现REST API

    JSON 使用Jackson jar包.@RequestBody.@ResponseBody注解,达到: 1. 请求JSON消息体映射为JAVA对象 2. 返回JAVA对象映射为JSON消息体 Ste ...

  7. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  8. Java Spring MVC 和 REST 处理404等异常的不同

    第一, 需要注意Spring MVC 和 Spring Rest两种情况下的区别. Spring MVC是可以通过增加/error的handler来处理异常的, 而REST却不行,因为在spring ...

  9. Java Spring MVC框架搭建(一)

    环境准备 >>>>>>java JDK和tomcat,eclipse 1.创建项目 2.项目名称自定义,这边为demo 3.我们已经创建完一个动态网站的项目,还得下 ...

  10. Java Spring MVC

    Spring MVC的实现包括 实现Controller类和基于注解的Controller RequstMapping方式 依赖: <!-- https://mvnrepository.com/ ...

最新文章

  1. java spring 上传图片,springboot 上传图片并回显
  2. retrofit content-length为0_大佬们,一波RxJava 3.0来袭,请做好准备~
  3. java gradle构建_在Gradle中为JPMS构建Java 6-8库
  4. python科学计算三剑客_机器学习三剑客之Numpy
  5. python编辑器中文字体倒立的_如何用Python+人工识别处理知乎的倒立汉字验证码...
  6. dedecms(织梦) arclist 标签的使用
  7. 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
  8. HIVE学习之(三)
  9. 极光推送源码api封装改造
  10. 汉王考勤管理软件mysql数据库配置_汉王人脸通考勤管理软件
  11. crypto.js 前端加解密
  12. windows下Navicat 过期如何解决
  13. django_jquery_ajax二级联动菜单
  14. window上装python,pip
  15. easypanel b.php,easypanel 免费主机面板
  16. C语言编程b a化简,C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形......
  17. 关于MD服装大师制作后导入到SP中的设置相关问题
  18. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园竞赛管理系统设计与实现hyr9b
  19. SpringBoot+vue实现前后端分离的简历系统
  20. 昨晚深夜听到清青门前有个女生在哭

热门文章

  1. 路由交换笔记(27)--ACL访问控制列表之练习
  2. ASP.NET 配置概览
  3. 【免费毕设】asp.net电子书城系统设计与实现(源代码+lunwen)
  4. 【论文写作】城市酒店入住信息管理系统中客房各项功能如何写
  5. python模块文件的扩展名不一定是py_Python导入:导入没有.py扩展名的模块?
  6. java 调用.net类库_通过COM组件方式实现java调用C#写的DLL文件
  7. oracle sql group_con,SQL:Group Functions,GROUP BY,HAVING
  8. 机器视觉:偏振镜光学原理和在机器视觉中的应用
  9. 机器视觉光源亮度应如何选择
  10. 产品研发过程管理专题——产品需求分析原则二