JavaParser基于注释生成接口文档

前言

swagger接口文档侵入性比较强, 本来计划基于java注释做一个开源组件。经过调研选择了 JavaParser, 奈何解决不了jar包的注释问题, 所以最终放弃了, 仅记录下调研过程中的单元测试~

测试

1
2
3
4
5
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
<version>3.22.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package cn.idea360.docs;

import com.github.javaparser.JavaParser;
import com.github.javaparser.ParseResult;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.javadoc.Javadoc;
import com.github.javaparser.javadoc.JavadocBlockTag;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.util.List;
import java.util.Optional;

/**
* @author cuishiying
* @date 2021-01-22
*/
public class JavaParserTest {

CompilationUnit cu;
@BeforeEach
public void runBeforeTestMethod() throws Exception{
File javaFile = new File("/Users/cuishiying/work/rest-docs/src/main/java/cn/idea360/docs/controller/UserController.java");
JavaParser javaParser = new JavaParser();
ParseResult<CompilationUnit> parseResult = javaParser.parse(javaFile);
parseResult.ifSuccessful(compilationUnit -> {
cu = compilationUnit;
});

}

@Test
void t1() {
// 获取所有注释信息
List<Comment> comments = cu.getComments();
System.out.println(comments);
}

@Test
void t2() {
for (Comment comment : cu.getAllContainedComments()) {
// 获取注释内容
String content = comment.getContent();
System.out.println(content);
}
}

@Test
void t3() {
for (Comment comment : cu.getAllContainedComments()) {
// 解析注释
Javadoc parse = comment.asJavadocComment().parse();
String methodDesc = parse.getDescription().toText();
System.out.println("方法注释:" + methodDesc);
List<JavadocBlockTag> blockTags = parse.getBlockTags();
for (JavadocBlockTag javadocBlockTag: blockTags) {
Optional<String> name = javadocBlockTag.getName();
name.ifPresent(k -> {
String text = javadocBlockTag.getContent().getElements().get(0).toText();
System.out.println("参数注释: " + k + ":" + text);
});
}
}
}

@Test
void t4() {
Optional<ClassOrInterfaceDeclaration> userController = cu.getClassByName("UserController");
userController.ifPresent(c -> {
c.getJavadoc().ifPresent(javadoc -> {
// 解析注释
String methodDesc = javadoc.getDescription().toText();
System.out.println("方法注释:" + methodDesc);
List<JavadocBlockTag> blockTags = javadoc.getBlockTags();
for (JavadocBlockTag javadocBlockTag: blockTags) {
String name = javadocBlockTag.getTagName();
String content = javadocBlockTag.getContent().toText();
System.out.println("参数注释: " + name + ":" + content);
}
});
});
}

}

最后

本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】支持一下。