在前后端分离的今天,为了保证进度,前后端一般同步进行开发,所以后端需要先给出接口文档,再写实现。
经过笔者不断地寻找写文档的优化方案,至少尝试过以下方式:
但是,今天这款插件也是笔者一直想做的,还是那句话:程序员应该是懒惰的,绝不重复造轮子!
其Github地址和文档
smart-doc是一个java restful api文档生成工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法。 smart-doc完全基于接口源码分析来生成接口文档,完全做到零注解侵入,你只需要按照java标准注释的写,smart-doc就能帮你生成一个简易明了的markdown 或是一个像GitBook样式的静态html文档。如果你已经厌倦了swagger等文档工具的无数注解和强侵入污染,那请拥抱smart-doc吧!
下面就来尝试一下,个人感觉还是很好用的。
项目结构很简单,甚至项目都不用跑起来就可以测试,如下:
查看其插件最新版:https://mvnrepository.com/artifact/com.github.shalousun/smart-doc-maven-plugin
然后加入maven插件里:
<plugin>
<groupId>com.github.shalousungroupId>
<artifactId>smart-doc-maven-pluginartifactId>
<version>1.0.4version>
<configuration>
<configFile>./src/main/resources/smart-doc.jsonconfigFile>
<projectName>测试DEMOprojectName>
configuration>
<executions>
<execution>
<phase>compilephase>
<goals>
<goal>markdowngoal>
goals>
execution>
executions>
plugin>
也就是smart-doc.json
内容
{
"outPath": "D:\\workspace\\demo\\smart-doc-demo\\doc",
"allInOne": true,
"customResponseFields": [
{
"name": "resultCode",
"desc": "Response code",
"value": "200"
},
{
"name": "resultMsg",
"desc": "错误信息",
"value": null
}
],
"requestHeaders": [
{
"name": "token",
"type": "string",
"desc": "存放于cookie的校验信息",
"required": true,
"since": "-"
}
]
}
这里的customResponseFields
对应controller的返回值实体:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ResponseResult<T> {
/**
* 状态码
*/
private int resultCode;
/**
* 信息
*/
private String resultMsg;
/**
* 时间戳
*/
private Long tid;
/**
* 数据
*/
private T data;
}
如果要在header里传参,那就需要requestHeaders
.
完整的配置可以参考文档
首先要了解Javadoc有哪些注释?
可以参考:Java 文档注释
我们常用来写接口的也就几个:
然后再探讨如何写优美的文档,这里官方给了建议:https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html
下面是一个简单的示例:
import com.jimo.smartdocdemo.model.ResponseResult;
import com.jimo.smartdocdemo.model.User;
import org.springframework.web.bind.annotation.*;
/**
* 用户API
*
* @author jimo
* @version 1.0.0
*/
@RestController
@RequestMapping("/api/user")
public class UserController {
/**
* 根据id获取用户
*
* @param id ID
*/
@GetMapping("/{id}")
public ResponseResult<User> getUser(@PathVariable Integer id) {
return ResponseResult.create(new User(id, "U" + id, "pwd" + id));
}
}
这里的User对象要说明下:
首先字段要有注释,就当作解释参数含义了,同时支持[JSR303]规定的校验注解.
比如,不能为空的字段用@NotNull
标注
import javax.validation.constraints.NotNull;
/**
* 用户实体
*
* @author jimo
* @version 1.0.0
* @date 2020/3/25 20:22
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
/**
* 主键id
*/
private Integer id;
/**
* 用户名
*/
@NotNull
private String username;
/**
* 密码
*/
@NotNull
private String password;
}
可以通过命令行执行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
也可以在IDEA里执行插件:
在实践中,会遇到2个比较常见的问题
@ignore
: 见文档 /**
* 忽略,非參數
*
* @ignore
*/
private String name;
@apiNode
,代表详细内容,这样在生成html时锚的内容才不会很多: /**
* 获取特征(只是个简单的标题)
*
* @param param 参数
* @apiNote 这是一段非常详细的描述
*/
@PostMapping("/feature")
public ResponseResult<List<NameValue>> getFeature(){}
这里说下nginx的一个location配置代理多个静态资源:
# pwd
/deploy/doc
# ls
app1 app2
location /deploy {
alias /deploy/doc;
index index.html;
proxy_set_header X-Forwarded-Proto $scheme;
error_page 404 /index.html;
}