# lime-japi-docs-parser
**Repository Path**: xuchenoak/lime-japi-docs-parser
## Basic Information
- **Project Name**: lime-japi-docs-parser
- **Description**: lime-japi-docs-parser是一个Java Controller接口解析器,可以从Java源码中解析出Controller类及其接口方法的名称、注释、注解、方法参数和方法返回值等信息,这些信息可简单用于进行接口文档权限配置或快速生成接口文档等。解析器内部还提供了抽象类ClassParser,继承后就可以自己实现对任意类的解析
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: develop
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2023-04-12
- **Last Updated**: 2024-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, 源码解析, 接口文档
## README
# lime-japi-docs-parser
## 1 简介
lime-japi-docs-parser是一个Java Controller接口解析器,可以从Java源码中解析出Controller类及其接口方法的名称、注释、注解、方法参数和方法返回值等信息,这些信息可简单用于进行接口文档权限配置或快速生成接口文档等。解析器内部还提供了抽象类ClassParser,继承后就可以自己实现对任意类的解析。
支持JDK:1.8+
## 2 安装
### 2.1 引入依赖(方式一)
```xml
io.gitee.xuchenoak
lime-japi-docs-parser
1.0.3
```
### 2.2 下载jar包(方式二)
Maven中央库下载地址:https://repo1.maven.org/maven2/io/gitee/xuchenoak/lime-japi-docs-parser/
## 3 使用
### 3.1 源码注释
源码类、属性、方法的注释可参考如下:
```java
/**
* 测试类(或用@description注释:@description 测试类)
* @author testUser
* @create 2022/11/22
* ……
**/
public class Test {
/** 属性注释方式1(或用@description注释:@description 属性注释方式1) */
private String testFieldOne;
/**
* 属性注释方式2(或用@description注释:@description 属性注释方式2)
*/
private String testFieldTwo;
/**
* 方法注释(或用@description注释:@description 方法注释)
* @param username 用户名(方法参数注释用@param)
* @param age 年龄
* @param depts 部门列表
**/
public User addUser(String username, Integer age, List depts) {
// ……
}
}
```
### 3.2 调用入口
```java
public static void main(String[] args) {
// 直接调用build方法即可(ParserConfigHandler详见3.2)
LimeJapiDocsParser.build(new ParserConfigHandler() {
/**
* 提供解析相关配置
* @return
*/
@Override
public ParserConfig getParserConfig() {
// 路径为java源码绝对路径(必须写到java目录,且只能以java结尾,不带“/”)
return ParserConfig.build("F:/**/src/main/java");
}
/**
* 解析完成处理
* @param controllerDataList Controller及其接口方法数据集
*/
@Override
public void parseFinishedHandle(List controllerDataList) {
// 处理解析的Controller及其接口方法数据集
}
});
}
```
### 3.3 ParserConfigHandler
```java
// 解析配置控制接口
public interface ParserConfigHandler {
// 提供解析相关配置(ParserConfig详见3.3)
ParserConfig getParserConfig();
// 提供解析时间
default Date getParseTime() {
// ControllerData的createTime与该时间一致,生成的controllerId由Controoler类File的MD5与该时间组成
// 默认new Date()
return new Date();
}
// Controller类解析节点数据处理
default void controllerNodeHandle(ControllerNode controllerNode) {
// 解析完成一个Controller得到controllerNode会调用该方法
// 默认不进行处理
}
// Controller类及其接口方法数据处理
default void controllerDataHandle(ControllerData controllerData) {
// 解析完成一个Controller得到controllerData会调用该方法
// 默认不进行处理
}
// 参数验证注入处理
default void paramValidInjectHandle(List annotationNodeList, FieldInfo fieldInfo) {
// annotationNodeList为该参数的注解集
// fieldInfo为参数对象
// 默认进行了部分注解的验证实现,可参考默认实现进行重写
}
// 参数默认值注入处理
default void paramDefaultValueInjectHandle(List annotationNodeList, FieldInfo fieldInfo) {
// annotationNodeList为该参数的注解集
// fieldInfo为参数对象
// 默认注入部分参数类型的默认值,可参考默认实现进行重写
}
// 解析完成处理
void parseFinishedHandle(List controllerDataList);
}
```
### 3.4 ParserConfig
```java
// 解析配置类(以下属性均提供了add链式调用方法,参数也均为动态参数)
public class ParserConfig {
// java源码绝对路径(必须写到java目录,且只能以java结尾,不带“/”)
// 如果项目是多模块则将多模块的源码路径都加进去即可
private Set javaFilePaths;
// 自定义识别为基础数据类型的类全名(默认已包含基础数据类型及其包装类和Big类,无需再添加),作用是遇到该类型时不再拆开解析其属性,认为是最后的类型
private Set lastValueTypeFullName;
// 仅扫描解析该包集合下的controller类(必须位于javaFilePaths下,若不配置默认扫描javaFilePaths下所有)
private Set filterControllerPackages;
// 仅扫描的controller类名集(非类全名,按照文件名称字符串匹配)
private Set filterControllerNames;
// 需要排除的controller类名集(非类全名,按照文件名称字符串匹配)
private Set ignoreControllerNames;
}
```
## 4 答疑
### 4.1 如何用ClassParser解析任意类?
```java
public static void main(String[] args) {
// 第一步:选其一添加java源码绝对路径(必须写到java目录,且只能以java结尾,不带“/”)
ClassParser.addRootPath("");
ClassParser.addRootPaths(new Set());
// 第二部:实例化抽象类ClassParser并调用其parse方法传入需要解析的java源码文件即可
ClassNode classNode = new ClassParser(){}.parse(new File("F:/**/src/main/java/com/test/TestBean.java"));
// 注意:如果不添加java源码绝对路径将无法解析该类内依赖的其它类
}
```
### 4.2 如何将FieldDataNode生成Json?
在`io.gitee.xuchenoak.limejapidocs.parser.util.StringUtil`下提供了`toFormatJsonStr()`方法可将FieldDataNode生成Json,方式注释如下:
```java
package io.gitee.xuchenoak.limejapidocs.parser.util;
public class StringUtil {
/**
* FieldDataNode生成Json
*
* @param fieldDataNode 字段节点
* @param startRetractNum 起始缩进空格数
* @param retractNum 字段缩进空格数
* @param hasComment 是否有注释
* @param hasType 是否有类型
* @param hasValid 是否有验证
* @param isJson 是否为Json(key值是否加双引号)
* @param addDefaultValue 是否填充默认值
* @return 格式化后的Json
*/
public static String toFormatJsonStr(FieldDataNode fieldDataNode, int startRetractNum, int retractNum, boolean hasComment, boolean hasType, boolean hasValid, boolean isJson, boolean addDefaultValue) {
// ……
}
}
```
## 5 更新记录
- 2023-01-01 V1.0.1 发布
- 2024-04-10 V1.0.2 更新:
- 引入slf4j-simple。
- BUG修复:
1. 修复了ControllerParser.parseBaseUri空指针问题;
2. 修复了对象接收param参数无法解析Valid/Validated参数验证问题。
- 2024-05-28 V1.0.3 更新:
- BUG修复:修复了多行注释仅注释了一行的问题。
## 6 最后&致谢
1. 本项目的灵感源于`@YeDaxia`的项目 [JApiDocs](https://github.com/YeDaxia/JApiDocs),它是一个可以解析Java源码并生成接口文档(支持生成html静态页或markdown等)的工具;
2. 本项目解析Java源码使用的是项目 [javaparser](http://javaparser.org/) 提供的解析器。