diff --git a/build.gradle b/build.gradle index e934733..91538dd 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'cn.gudqs7.idea.plugins' -version '2.6.0' +version '2.6.2' repositories { mavenCentral() diff --git a/parts/changeNotes.html b/parts/changeNotes.html index 589224b..5acbed7 100644 --- a/parts/changeNotes.html +++ b/parts/changeNotes.html @@ -1,6 +1,10 @@
+Release v2.6.2
+ 1.支持java8所有的时间类型
+ 2.修复近期的一些Issues缺陷
+ 3.支持swagger3注解(ruoyi框架常用的几个);
Release v2.6.0
1.feat: 批量导出时, 新增带全部数据的单独 markdown 文件; #88
2.fix: 修复随机字符串使用了中文生僻字过多像乱码一样的问题: 不生成中文, 生成字母; #89
diff --git a/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java b/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
index 45ef538..e3d2d16 100644
--- a/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
+++ b/src/main/java/cn/gudqs7/plugins/common/base/reader/AbstractReader.java
@@ -57,7 +57,7 @@ public T read0(StructureAndCommentInfo structureAndCommentInfo, Map children = structureAndCommentInfo.getChildren();
- if (children != null && children.size() > 0) {
+ if (children != null && !children.isEmpty()) {
Map loopData = new HashMap<>(8);
loopData.put(MapKeyConstant.READER_PARENT_KEY, parentData);
beforeLoop(structureAndCommentInfo, loopData, data, parentData);
diff --git a/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java b/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
index c1f8852..2ca0612 100644
--- a/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
+++ b/src/main/java/cn/gudqs7/plugins/common/enums/CommentTagEnum.java
@@ -22,6 +22,7 @@ public enum CommentTagEnum {
EXAMPLE("example"),
NOTES("notes"),
TAGS("tags"),
+ NAME("name"),
IMPORTANT("important", true),
DESCRIPTION("description"),
;
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
index 9b29a73..d3f6262 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/AnnotationHolder.java
@@ -18,6 +18,15 @@ public interface AnnotationHolder {
String QNAME_OF_PARAM = "io.swagger.annotations.ApiParam";
String QNAME_OF_RESPONSE = "io.swagger.annotations.ApiResponse";
String QNAME_OF_RESPONSES = "io.swagger.annotations.ApiResponses";
+
+ // 新增 Swagger v3 注解
+ String QNAME_OF_OPENAPI_API = "io.swagger.v3.oas.annotations.tags.Tag";
+ String QNAME_OF_OPENAPI_OPERATION = "io.swagger.v3.oas.annotations.Operation";
+ String QNAME_OF_OPENAPI_SCHEMA = "io.swagger.v3.oas.annotations.media.Schema";
+ String QNAME_OF_OPENAPI_PARAMETER = "io.swagger.v3.oas.annotations.Parameter";
+ String QNAME_OF_OPENAPI_RESPONSE = "io.swagger.v3.oas.annotations.responses.ApiResponse";
+ String QNAME_OF_OPENAPI_RESPONSES = "io.swagger.v3.oas.annotations.responses.ApiResponses";
+
String QNAME_OF_MAPPING = "org.springframework.web.bind.annotation.RequestMapping";
String QNAME_OF_GET_MAPPING = "org.springframework.web.bind.annotation.GetMapping";
String QNAME_OF_POST_MAPPING = "org.springframework.web.bind.annotation.PostMapping";
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
index fc0f95d..adf6fb1 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiClassAnnotationHolderImpl.java
@@ -101,8 +101,9 @@ public CommentInfo getCommentInfoByAnnotation() {
commentInfo.setValue(getAnnotationValueByQname(QNAME_OF_MODEL, CommentTagEnum.DEFAULT.getTag()));
}
if (hasAnnotation(QNAME_OF_API)) {
- commentInfo.setValue(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag()));
- commentInfo.setNotes(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag()));
+ String description = getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.DESCRIPTION.getTag());
+ commentInfo.setValue(description);
+ commentInfo.setNotes(description);
List tagsList = getAnnotationListValueByQname(QNAME_OF_API, CommentTagEnum.TAGS.getTag());
String tags = "";
if (CollectionUtils.isNotEmpty(tagsList)) {
@@ -111,12 +112,18 @@ public CommentInfo getCommentInfoByAnnotation() {
commentInfo.setTags(tags);
commentInfo.setHidden(getAnnotationValueByQname(QNAME_OF_API, CommentTagEnum.HIDDEN.getTag()));
}
+ if (hasAnnotation(QNAME_OF_OPENAPI_API)) {
+ String description = getAnnotationValueByQname(QNAME_OF_OPENAPI_API, CommentTagEnum.DESCRIPTION.getTag());
+ commentInfo.setValue(description);
+ commentInfo.setNotes(description);
+ commentInfo.setTags(getAnnotationValueByQname(QNAME_OF_OPENAPI_API, CommentTagEnum.NAME.getTag()));
+ }
return commentInfo;
}
@Override
protected boolean usingAnnotation() {
- return hasAnyOneAnnotation(QNAME_OF_MODEL, QNAME_OF_API);
+ return hasAnyOneAnnotation(QNAME_OF_MODEL, QNAME_OF_API, QNAME_OF_OPENAPI_API);
}
}
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
index 86acf5b..f706ef0 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiFieldAnnotationHolderImpl.java
@@ -5,6 +5,7 @@
import cn.gudqs7.plugins.common.enums.MoreCommentTagEnum;
import cn.gudqs7.plugins.common.pojo.resolver.CommentInfo;
import cn.gudqs7.plugins.common.pojo.resolver.CommentInfoTag;
+import cn.gudqs7.plugins.common.util.structure.PsiAnnotationUtil;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
@@ -79,12 +80,12 @@ public CommentInfoTag getCommentInfoByComment() {
@Override
public CommentInfo getCommentInfoByAnnotation() {
CommentInfo commentInfo = new CommentInfo();
- boolean hasAnnotatation = hasAnnotation(QNAME_OF_PROPERTY);
- if (hasAnnotatation) {
- commentInfo.setHidden(getAnnotationValueByProperty(CommentTagEnum.HIDDEN.getTag()));
- commentInfo.setRequired(getAnnotationValueByProperty(CommentTagEnum.REQUIRED.getTag()));
- String value = getAnnotationValueByProperty(CommentTagEnum.DEFAULT.getTag());
- String notes = getAnnotationValueByProperty(CommentTagEnum.NOTES.getTag());
+ PsiAnnotation psiAnnotation = getAnnotationByQname(QNAME_OF_PROPERTY);
+ if (psiAnnotation != null) {
+ commentInfo.setHidden(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.HIDDEN.getTag()));
+ commentInfo.setRequired(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.REQUIRED.getTag()));
+ String value = getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.DEFAULT.getTag());
+ String notes = getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.NOTES.getTag());
if (StringUtils.isNotBlank(value)) {
value = value.replaceAll("\\n", CommonConst.BREAK_LINE);
}
@@ -93,7 +94,15 @@ public CommentInfo getCommentInfoByAnnotation() {
}
commentInfo.setValue(value);
commentInfo.setNotes(notes);
- commentInfo.setExample(getAnnotationValueByProperty(CommentTagEnum.EXAMPLE.getTag()));
+ commentInfo.setExample(getAnnotationValueByProperty(psiAnnotation,CommentTagEnum.EXAMPLE.getTag()));
+ }
+ psiAnnotation = getAnnotationByQname(QNAME_OF_OPENAPI_SCHEMA);
+ if (psiAnnotation != null) {
+ // 补充 CommentInfo 中已有的属性
+ commentInfo.setHidden(getAnnotationValueByProperty(psiAnnotation, "hidden"));
+ commentInfo.setRequired(getAnnotationValueByProperty(psiAnnotation, "required"));
+ commentInfo.setValue(getAnnotationValueByProperty(psiAnnotation, "description"));
+ commentInfo.setExample(getAnnotationValueByProperty(psiAnnotation, "example"));
}
dealOtherAnnotation(commentInfo);
return commentInfo;
@@ -118,9 +127,19 @@ private T getAnnotationValueByProperty(String attr) {
return getAnnotationValueByQname(QNAME_OF_PROPERTY, attr);
}
+ /**
+ * 获取注解中的信息
+ *
+ * @param attr 注解字段
+ * @return 信息
+ */
+ private T getAnnotationValueByProperty( PsiAnnotation psiAnnotation,String attr) {
+ return PsiAnnotationUtil.getAnnotationValue(psiAnnotation, attr, null);
+ }
+
@Override
protected boolean usingAnnotation() {
- return hasAnnotation(QNAME_OF_PROPERTY);
+ return hasAnyOneAnnotation(QNAME_OF_PROPERTY, QNAME_OF_OPENAPI_SCHEMA);
}
}
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
index 0ebe6fa..67f6947 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiMethodAnnotationHolderImpl.java
@@ -113,8 +113,10 @@ public CommentInfoTag getCommentInfoByComment() {
@Override
public CommentInfo getCommentInfoByAnnotation() {
CommentInfo commentInfo = new CommentInfo();
- boolean hasOperationAnnotation = hasAnnotation(QNAME_OF_OPERATION);
- if (hasOperationAnnotation) {
+
+ // 方法级别的注解:优先使用 @ApiOperation,如果没有则使用 @Operation
+ if (hasAnnotation(QNAME_OF_OPERATION)) {
+ // 使用 Swagger v2 的 @ApiOperation 注解
commentInfo.setHidden(getAnnotationValueByApiOperation(CommentTagEnum.HIDDEN.getTag()));
String value = getAnnotationValueByApiOperation(CommentTagEnum.DEFAULT.getTag());
String notes = getAnnotationValueByApiOperation(CommentTagEnum.NOTES.getTag());
@@ -126,34 +128,40 @@ public CommentInfo getCommentInfoByAnnotation() {
}
commentInfo.setValue(value);
commentInfo.setNotes(notes);
+ } else if (hasAnnotation(QNAME_OF_OPENAPI_OPERATION)) {
+ // 使用 Swagger v3 的 @Operation 注解
+ String summary = getAnnotationValueByQname(QNAME_OF_OPENAPI_OPERATION, "summary");
+ String description = getAnnotationValueByQname(QNAME_OF_OPENAPI_OPERATION, "description");
+ commentInfo.setValue(summary); // 映射到 value
+ commentInfo.setNotes(description); // 映射到 notes
}
- // 添加 knife4j 的 ApiOperationSupport 注解支持, 主要是 includeParameters 和 ignoreParameters
- // 优先级是有 ignoreParameters 则跳过 includeParameters 字段
- if (hasAnnotation(QNAME_OF_OPERATION_SUPPORT)) {
- List includeParameters = getAnnotationValueByQname(QNAME_OF_OPERATION_SUPPORT, "includeParameters");
- addRequestTagInfo(commentInfo, includeParameters, MoreCommentTagEnum.ONLY_REQUEST.getTag());
- List ignoreParameters = getAnnotationValueByQname(QNAME_OF_OPERATION_SUPPORT, "ignoreParameters");
- addRequestTagInfo(commentInfo, ignoreParameters, MoreCommentTagEnum.HIDDEN_REQUEST.getTag());
- }
+
+ // 响应信息:优先使用 @ApiResponses,如果没有则使用 @ApiResponses
if (hasAnnotation(QNAME_OF_RESPONSES)) {
- // 存在多个 code
+ // 使用 Swagger v2 的 @ApiResponses 注解
List psiAnnotationList = getAnnotationValueByQname(QNAME_OF_RESPONSES, "value");
- if (psiAnnotationList != null && psiAnnotationList.size() > 0) {
+ if (psiAnnotationList != null) {
for (PsiAnnotation psiAnnotation : psiAnnotationList) {
Integer code = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "code", null);
String message = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "message", null);
- ResponseCodeInfo codeInfo = new ResponseCodeInfo(String.valueOf(code), message);
- commentInfo.getResponseCodeInfoList().add(codeInfo);
+ commentInfo.getResponseCodeInfoList().add(new ResponseCodeInfo(String.valueOf(code), message));
+ }
+ }
+ } else if (hasAnnotation(QNAME_OF_OPENAPI_RESPONSES)) {
+ // 使用 Swagger v3 的 @ApiResponses 注解
+ List psiAnnotationList = getAnnotationValueByQname(QNAME_OF_OPENAPI_RESPONSES, "value");
+ if (psiAnnotationList != null) {
+ for (PsiAnnotation psiAnnotation : psiAnnotationList) {
+ Integer code = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "responseCode", null);
+ String description = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "description", null);
+ commentInfo.getResponseCodeInfoList().add(new ResponseCodeInfo(String.valueOf(code), description));
}
}
- } else if (hasAnnotation(QNAME_OF_RESPONSE)) {
- // 存在单个 code
- Integer code = getAnnotationValueByQname(QNAME_OF_RESPONSE, "code");
- String message = getAnnotationValueByQname(QNAME_OF_RESPONSE, "message");
- ResponseCodeInfo codeInfo = new ResponseCodeInfo(String.valueOf(code), message);
- commentInfo.getResponseCodeInfoList().add(codeInfo);
}
+
+ // 请求映射处理
dealRequestMapping(commentInfo);
+
return commentInfo;
}
@@ -164,6 +172,7 @@ public CommentInfo getCommentInfoByAnnotation() {
* @return 信息
*/
private T getAnnotationValueByApiOperation(String attr) {
+
return getAnnotationValueByQname(QNAME_OF_OPERATION, attr);
}
@@ -310,7 +319,7 @@ private void dealHttpMethod(CommentInfo commentInfo, String qnameOfXxxMapping, S
@Override
protected boolean usingAnnotation() {
- return hasAnnotation(QNAME_OF_OPERATION);
+ return hasAnyOneAnnotation(QNAME_OF_OPERATION,QNAME_OF_OPENAPI_OPERATION);
}
}
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
index b469201..ff243c9 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/comment/PsiParameterAnnotationHolderImpl.java
@@ -35,6 +35,7 @@ public CommentInfoTag getCommentInfoByComment() {
CommentInfoTag commentInfoTag = new CommentInfoTag();
PsiElement parent = psiParameter.getParent().getParent();
String parameterName = psiParameter.getName();
+
if (parent instanceof PsiMethod) {
for (PsiElement child : parent.getChildren()) {
if (child instanceof PsiDocComment) {
@@ -42,49 +43,19 @@ public CommentInfoTag getCommentInfoByComment() {
Map moreCommentTagMap = MoreCommentTagEnum.allTagMap();
PsiDocComment psiComment = (PsiDocComment) child;
String text = psiComment.getText();
+
if (text.startsWith("/**") && text.endsWith("*/")) {
String[] lines = text.replaceAll("\r", "").split("\n");
for (String line : lines) {
- if (line.contains("/**") || line.contains("*/")) {
- continue;
- }
- line = removeJavaDocPrefix(line);
- if (StringUtils.isBlank(line)) {
+ line = processCommentLine(line);
+ if (line == null) {
continue;
}
- if (line.contains("@")) {
- String atParam = "@param";
- if (line.startsWith("@param")) {
- line = line.substring(atParam.length()).trim();
- String[] paramInfoArray = line.split(" ");
- String fieldName = "";
- if (paramInfoArray.length > 0) {
- fieldName = paramInfoArray[0];
- }
- if (!fieldName.equals(parameterName)) {
- continue;
- }
- String tag = line.substring(fieldName.length()).trim();
- String[] tagArray = tag.split(" ");
- for (String t : tagArray) {
- String tagName = t;
- String tagVal = null;
- if (t.contains("=")) {
- String[] tagKeyVal = t.split("=");
- tagName = tagKeyVal[0];
- if (tagKeyVal.length > 1) {
- tagVal = tagKeyVal[1];
- }
- }
- if (commentTagMap.containsKey(tagName)) {
- setCommentInfoByTag(commentInfoTag, tagName, tagVal);
- } else if (moreCommentTagMap.containsKey(tagName)) {
- commentInfoTag.appendToTag(tagName, tagVal);
- } else {
- commentInfoTag.appendValue(t, CommonConst.SPACE);
- }
- }
- }
+
+ if (line.startsWith("@param")) {
+ processParamTag(line, parameterName, commentTagMap, moreCommentTagMap, commentInfoTag);
+ } else {
+ commentInfoTag.appendValue(line, CommonConst.SPACE);
}
}
}
@@ -92,10 +63,66 @@ public CommentInfoTag getCommentInfoByComment() {
}
}
}
+
dealOtherAnnotation(commentInfoTag);
return commentInfoTag;
}
+ private String processCommentLine(String line) {
+ // 去除注释前缀并修剪空白字符
+ line = removeJavaDocPrefix(line).trim();
+ if (StringUtils.isBlank(line)) {
+ return null; // 如果行为空或仅包含空白字符,返回 null
+ }
+ return line;
+ }
+
+ private void processParamTag(String line, String parameterName,
+ Map commentTagMap,
+ Map moreCommentTagMap,
+ CommentInfoTag commentInfoTag) {
+ // 去掉 "@param" 前缀
+ line = line.substring("@param".length()).trim();
+ // 分割参数名和注释内容
+ String[] paramInfoArray = line.split(" ", 2);
+ if (paramInfoArray.length < 2) {
+ return; // 格式错误,跳过
+ }
+
+ String fieldName = paramInfoArray[0];
+ if (!fieldName.equals(parameterName)) {
+ return; // 不是当前参数,跳过
+ }
+
+ // 获取注释内容部分
+ String tagContent = paramInfoArray[1];
+ // 分割注释内容中的标签
+ String[] tagArray = tagContent.split(" ");
+ for (String tagEntry : tagArray) {
+ String tagName = tagEntry;
+ String tagVal = null;
+
+ // 处理键值对形式的标签
+ if (tagEntry.contains("=")) {
+ String[] tagKeyValue = tagEntry.split("=", 2);
+ tagName = tagKeyValue[0];
+ if (tagKeyValue.length > 1) {
+ tagVal = tagKeyValue[1];
+ }
+ }
+
+ // 根据标签类型处理
+ if (commentTagMap.containsKey(tagName)) {
+ setCommentInfoByTag(commentInfoTag, tagName, tagVal);
+ } else if (moreCommentTagMap.containsKey(tagName)) {
+ commentInfoTag.appendToTag(tagName, tagVal);
+ } else {
+ commentInfoTag.appendValue(tagEntry, CommonConst.SPACE);
+ }
+ }
+ }
+
+
@Override
public CommentInfo getCommentInfoByAnnotation() {
CommentInfo commentInfo = new CommentInfo();
diff --git a/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java b/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
index 97db4e0..e0e042f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
+++ b/src/main/java/cn/gudqs7/plugins/common/resolver/structure/StructureAndCommentResolver.java
@@ -283,7 +283,7 @@ private StructureAndCommentInfo resolveByPsiType0(StructureAndCommentInfo parent
structureAndCommentInfo.setFieldName(fieldName);
structureAndCommentInfo.setCommentInfo(commentInfo);
structureAndCommentInfo.setFieldType(fieldTypeName);
- structureAndCommentInfo.setOriginalFieldType(psiFieldTypeName);
+ structureAndCommentInfo.setOriginalFieldType(psiFieldType.getCanonicalText());
structureAndCommentInfo.setFieldTypeCode(fieldTypeCode);
structureAndCommentInfo.setOriginalFieldTypeCode(FieldType.BASE.getType());
structureAndCommentInfo.setPsiType(psiFieldType);
diff --git a/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java b/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
index fb59b2b..c93f00f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
+++ b/src/main/java/cn/gudqs7/plugins/common/util/structure/BaseTypeUtil.java
@@ -7,6 +7,7 @@
import cn.gudqs7.plugins.common.util.PluginSettingHelper;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiType;
+import groovy.lang.GroovyShell;
import lombok.Data;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang3.RandomUtils;
@@ -14,6 +15,7 @@
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
@@ -30,13 +32,11 @@ public class BaseTypeUtil {
static {
Function stringGetFn = commentInfo -> {
String example = commentInfo.getExample("");
- boolean noExampleValue = StringUtils.isBlank(example);
- return noExampleValue ? randomString(commentInfo) : example;
+ return StringUtils.isBlank(example) ? randomString(commentInfo) : example;
};
Function dateGetFn = commentInfo -> {
String example = commentInfo.getExample("");
- boolean noExampleValue = StringUtils.isBlank(example);
- return noExampleValue ? randomDate(commentInfo) : example;
+ return StringUtils.isBlank(example) ? randomDate(commentInfo) : example;
};
// 此处处理不能直接 new 的类型, 也就是接口, 常用的接口目前只想到三大集合
OTHER_INTERFACE_MAP.put("java.util.List", TypeInfo.of("java.util.ArrayList", "new ArrayList<>()", new ArrayList<>()));
@@ -49,16 +49,30 @@ public class BaseTypeUtil {
OTHER_BASE_TYPE_MAP.put("java.lang.Number", TypeInfo.of("0", commentInfo -> 0));
OTHER_BASE_TYPE_MAP.put("java.math.BigDecimal", TypeInfo.of("java.math.BigDecimal", "new BigDecimal(0)", commentInfo -> {
String example = commentInfo.getExample("");
- boolean noExampleValue = StringUtils.isBlank(example);
- return noExampleValue ? BigDecimal.valueOf(randomDouble()) : new BigDecimal(example);
+ return StringUtils.isBlank(example) ? BigDecimal.valueOf(randomDouble()).setScale(2, RoundingMode.HALF_UP) : new BigDecimal(example);
}));
// 日期, 时间
- OTHER_BASE_TYPE_MAP.put("java.util.Date", TypeInfo.of("java.util.Date", "new Date()", dateGetFn));
- OTHER_BASE_TYPE_MAP.put("java.time.LocalDateTime", TypeInfo.of("java.time.LocalDateTime", "LocalDateTime.now()", dateGetFn));
- OTHER_BASE_TYPE_MAP.put("java.sql.Date", TypeInfo.of("java.sql.Date", "new Date(System.currentTimeMillis())", dateGetFn));
- OTHER_BASE_TYPE_MAP.put("java.sql.Timestamp", TypeInfo.of("java.sql.Timestamp", "new Timestamp(System.currentTimeMillis())", dateGetFn));
- OTHER_BASE_TYPE_MAP.put("java.sql.Time", TypeInfo.of("java.sql.Time", "new Time(System.currentTimeMillis())", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.util.Date", TypeInfo.of("java.util.Date", "org.apache.commons.lang.time.DateFormatUtils.format(new java.util.Date(), \"yyyy-MM-dd HH:mm:ss\")", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.sql.Date", TypeInfo.of("java.sql.Date", "new java.sql.Date(System.currentTimeMillis()).toString()", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.sql.Timestamp", TypeInfo.of("java.sql.Timestamp", "new java.sql.Timestamp(System.currentTimeMillis()).toString()", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.sql.Time", TypeInfo.of("java.sql.Time", "new java.sql.Time(System.currentTimeMillis()).toString()", dateGetFn));
+
+ // 添加 Java 8 时间类型
+ OTHER_BASE_TYPE_MAP.put("java.time.LocalDateTime", TypeInfo.of("java.time.LocalDateTime",
+ "java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.LocalDate", TypeInfo.of("java.time.LocalDate",
+ "java.time.LocalDate.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.LocalTime", TypeInfo.of("java.time.LocalTime",
+ "java.time.LocalTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"HH:mm:ss\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.Instant", TypeInfo.of("java.time.Instant",
+ "java.time.Instant.now().atZone(java.time.ZoneId.systemDefault()).format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.ZonedDateTime", TypeInfo.of("java.time.ZonedDateTime",
+ "java.time.ZonedDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss.SSSXXX\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.OffsetDateTime", TypeInfo.of("java.time.OffsetDateTime",
+ "java.time.OffsetDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ss.SSSXXX\"))", dateGetFn));
+ OTHER_BASE_TYPE_MAP.put("java.time.OffsetTime", TypeInfo.of("java.time.OffsetTime",
+ "java.time.OffsetTime.now().format(java.time.format.DateTimeFormatter.ofPattern(\"HH:mm:ss.SSSXXX\"))", dateGetFn));
OTHER_BASE_TYPE_MAP.put("java.sql.Blob", TypeInfo.of("javax.sql.rowset.serial.SerialBlob", "new SerialBlob(new byte[]{})", stringGetFn));
OTHER_BASE_TYPE_MAP.put("java.sql.Clob", TypeInfo.of("javax.sql.rowset.serial.SerialClob", "new SerialClob(new char[]{})", stringGetFn));
@@ -248,12 +262,17 @@ public static Object getBaseDefaultVal(PsiType psiType, CommentInfo commentInfo)
String typeName = psiType.getPresentableText();
String qName = psiType.getCanonicalText();
TypeInfo typeInfo = JAVA_BASE_TYPE_MAP.get(typeName.toLowerCase());
- if (typeInfo == null) {
- typeInfo = OTHER_BASE_TYPE_MAP.get(qName);
- }
if (typeInfo != null) {
return typeInfo.getDefaultValGetFn().apply(commentInfo);
}
+ typeInfo = OTHER_BASE_TYPE_MAP.get(qName);
+ if (typeInfo != null) {
+ Object defaultValue = typeInfo.getDefaultValGetFn().apply(commentInfo);
+ if (defaultValue == null ) {
+ defaultValue = new GroovyShell().evaluate(typeInfo.getDefaultValStr());
+ }
+ return defaultValue;
+ }
return null;
}
@@ -290,9 +309,14 @@ private static boolean notUsingRandom() {
}
private static String randomDate(CommentInfo commentInfo) {
+ String pattern = commentInfo.getSingleStr(MoreCommentTagEnum.DATE_FORMAT.getTag(), null);
+ if (pattern == null) {
+ pattern = commentInfo.getSingleStr(MoreCommentTagEnum.JSON_FORMAT.getTag(), null);
+ }
+ if (pattern == null) {
+ return null;
+ }
Date now = new Date();
- String pattern = commentInfo.getSingleStr(MoreCommentTagEnum.JSON_FORMAT.getTag(), "yyyy-MM-dd'T'HH:mm:ss.SSS+0000");
- pattern = commentInfo.getSingleStr(MoreCommentTagEnum.DATE_FORMAT.getTag(), pattern);
now.setTime(System.currentTimeMillis() + RandomUtils.nextLong(0, 86400000));
if (notUsingRandom()) {
now.setTime(1338182040520L);
diff --git a/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java b/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
index 684e1ec..0a8e02f 100644
--- a/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
+++ b/src/main/java/cn/gudqs7/plugins/common/util/structure/PsiAnnotationUtil.java
@@ -1,10 +1,7 @@
package cn.gudqs7.plugins.common.util.structure;
import com.intellij.codeInsight.AnnotationUtil;
-import com.intellij.psi.JavaPsiFacade;
-import com.intellij.psi.PsiAnnotation;
-import com.intellij.psi.PsiAnnotationMemberValue;
-import com.intellij.psi.PsiReferenceExpression;
+import com.intellij.psi.*;
import lombok.SneakyThrows;
import org.jetbrains.annotations.NotNull;
@@ -124,19 +121,25 @@ public static T getAnnotationInfoByPojo(PsiAnnotation psiAnnotation,@NotNull
return instance;
}
+
private static Object getValueByPsiAnnotationMemberValue(PsiAnnotationMemberValue value) {
if (value instanceof PsiReferenceExpression) {
PsiReferenceExpression psiReferenceExpression = (PsiReferenceExpression) value;
- String text = psiReferenceExpression.getText();
- String prefixWithRequestMethod = "RequestMethod.";
- if (text.startsWith(prefixWithRequestMethod)) {
- return text.substring(prefixWithRequestMethod.length());
- } else {
- return text;
+ PsiElement resolvedElement = psiReferenceExpression.resolve();
+ // 如果解析到的是一个字段(如静态常量)
+ if (resolvedElement instanceof PsiField) {
+ PsiField field = (PsiField) resolvedElement;
+ PsiExpression initializer = field.getInitializer();
+ if (initializer != null) {
+ // 递归解析字段的初始化表达式
+ return getValueByPsiAnnotationMemberValue(initializer);
+ }
}
} else {
+ // 尝试直接计算常量表达式的值
return computeConstantExpression(value);
}
+ return null;
}
private static Object computeConstantExpression(PsiAnnotationMemberValue psiAnnotationMemberValue) {
diff --git a/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java b/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
index 35fc8bf..c9937cd 100644
--- a/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
+++ b/src/main/java/cn/gudqs7/plugins/savior/reader/Java2BulkReader.java
@@ -47,7 +47,7 @@ protected List handleReturnNull() {
}
private List getBulkList(Map json, String prefix) {
- if (json == null || json.size() == 0) {
+ if (json == null || json.isEmpty()) {
return new ArrayList<>();
}
List kvList = new ArrayList<>();
@@ -62,7 +62,7 @@ private List getBulkList(Map json, String prefix)
private void handleKeyValue(String prefix, List kvList, String key, Object value) {
if (value instanceof Map) {
Map map = (Map) value;
- if (map.size() == 0) {
+ if (map.isEmpty()) {
kvList.add(kv(prefix + key, FINAL_DEFAULT_OBJECT_EXAMPLE, "", true));
} else {
List mapKvList = getBulkList(map, prefix + key + ".");
diff --git a/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java b/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
index 3717be0..602233b 100644
--- a/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
+++ b/src/main/java/cn/gudqs7/plugins/savior/theme/RestfulTheme.java
@@ -65,7 +65,7 @@ public boolean handleMethodHidden(AnnotationHolder annotationHolder) {
@Override
public void afterCollectData(Map dataByStr, Project project, PsiMethod publicMethod, String interfaceClassName, CommentInfo commentInfo, StructureAndCommentInfo paramStructureAndCommentInfo, StructureAndCommentInfo returnStructureAndCommentInfo, Map java2jsonMap, Map returnJava2jsonMap, String java2jsonStr, String returnJava2jsonStr) {
- if (java2jsonMap == null || java2jsonMap.size() == 0) {
+ if (java2jsonMap == null || java2jsonMap.isEmpty()) {
dataByStr.put("jsonExample", "");
return;
}