From 4cc4c8e00a9c29958592ae646da72a7fb9423f6f Mon Sep 17 00:00:00 2001 From: shalousun Date: Sun, 11 Jul 2021 18:34:45 +0800 Subject: [PATCH] Support use FastJson JSONType annotation and Jackson JsonIgnoreProperties annotation to ignore fields. #https://gitee.com/smart-doc-team/smart-doc/issues/I401KH . --- README_CN.md | 2 +- .../doc/constants/DocAnnotationConstants.java | 15 ++++++ .../doc/constants/DocGlobalConstants.java | 2 + .../com/power/doc/helper/JsonBuildHelper.java | 12 +++-- .../power/doc/helper/ParamsBuildHelper.java | 11 +++-- .../com/power/doc/model/DocJavaField.java | 14 ++++++ .../com/power/doc/utils/JavaClassUtil.java | 47 ++++++++++++++++++- 7 files changed, 94 insertions(+), 9 deletions(-) diff --git a/README_CN.md b/README_CN.md index aac1cf5..578c9e0 100644 --- a/README_CN.md +++ b/README_CN.md @@ -125,7 +125,7 @@ smart-doc官方目前已经开发完成[Maven插件](https://gitee.com/smart-doc "outPath": "D://md2", //指定文档的输出路径 "coverOld": true, //是否覆盖旧的文件,主要用于mardown文件覆盖 "createDebugPage": true,//@since 2.0.0 smart-doc支持创建可以测试的html页面,仅在AllInOne模式中起作用。 - "packageFilters": "",//controller包过滤,多个包用英文逗号隔开,需要采用正则:com.test.controller.* + "packageFilters": "",//controller包过滤,多个包用英文逗号隔开,2.2.2开始需要采用正则:com.test.controller.* "md5EncryptedHtmlName": false,//只有每个controller生成一个html文件是才使用 "style":"xt256", //基于highlight.js的代码高设置,可选值很多可查看码云wiki,喜欢配色统一简洁的同学可以不设置 "projectName": "smart-doc",//配置自己的项目名称 diff --git a/src/main/java/com/power/doc/constants/DocAnnotationConstants.java b/src/main/java/com/power/doc/constants/DocAnnotationConstants.java index a1d85c9..dc43eb5 100644 --- a/src/main/java/com/power/doc/constants/DocAnnotationConstants.java +++ b/src/main/java/com/power/doc/constants/DocAnnotationConstants.java @@ -39,6 +39,11 @@ public interface DocAnnotationConstants { String SHORT_JSON_IGNORE = "JsonIgnore"; + /** + * jackson JsonIgnoreProperties annotation + */ + String SHORT_JSON_IGNORE_PROPERTIES = "JsonIgnoreProperties"; + String SHORT_JSON_PROPERTY = "JsonProperty"; String SHORT_JSON_FIELD = "JSONField"; @@ -68,4 +73,14 @@ public interface DocAnnotationConstants { String MAX = "max"; String JSON_PROPERTY = "JsonProperty"; + + /** + * Fastjson JSONType annotation + */ + String SHORT_JSON_TYPE = "JSONType"; + + /** + * Fastjson JSONType annotation ignores prop + */ + String IGNORE_PROP = "ignores"; } diff --git a/src/main/java/com/power/doc/constants/DocGlobalConstants.java b/src/main/java/com/power/doc/constants/DocGlobalConstants.java index 0d6c801..212d3d8 100644 --- a/src/main/java/com/power/doc/constants/DocGlobalConstants.java +++ b/src/main/java/com/power/doc/constants/DocGlobalConstants.java @@ -141,6 +141,8 @@ public interface DocGlobalConstants { String JAVA_OBJECT_FULLY = "java.lang.Object"; + String JAVA_BOOLEAN = "java.lang.Boolean"; + String JAVA_STRING_FULLY = "java.lang.String"; String JAVA_MAP_FULLY = "java.util.Map"; diff --git a/src/main/java/com/power/doc/helper/JsonBuildHelper.java b/src/main/java/com/power/doc/helper/JsonBuildHelper.java index 5e61dff..d1bc58b 100644 --- a/src/main/java/com/power/doc/helper/JsonBuildHelper.java +++ b/src/main/java/com/power/doc/helper/JsonBuildHelper.java @@ -211,14 +211,18 @@ public class JsonBuildHelper { boolean requestFieldToUnderline = builder.getApiConfig().isRequestFieldToUnderline(); boolean responseFieldToUnderline = builder.getApiConfig().isResponseFieldToUnderline(); List fields = JavaClassUtil.getFields(cls, 0, new LinkedHashMap<>()); + Map ignoreFields = JavaClassUtil.getClassJsonIgnoreFields(cls); out: for (DocJavaField docField : fields) { JavaField field = docField.getJavaField(); if (field.isTransient() && skipTransientField) { continue; } + String fieldName = docField.getFieldName(); + if (ignoreFields.containsKey(fieldName)) { + continue; + } String subTypeName = docField.getFullyQualifiedName(); - String fieldName = field.getName(); if ((responseFieldToUnderline && isResp) || (requestFieldToUnderline && !isResp)) { fieldName = StringUtil.camelToUnderline(fieldName); } @@ -260,10 +264,10 @@ public class JsonBuildHelper { } String typeSimpleName = field.getType().getSimpleName(); String fieldGicName = docField.getGenericCanonicalName(); - CustomField customResponseField = builder.getCustomRespFieldMap().get(typeName +"."+fieldName); - CustomField customRequestField = builder.getCustomReqFieldMap().get(typeName +"."+fieldName); + CustomField customResponseField = builder.getCustomRespFieldMap().get(typeName + "." + fieldName); + CustomField customRequestField = builder.getCustomReqFieldMap().get(typeName + "." + fieldName); - if (customRequestField != null && JavaClassUtil.isTargetChildClass(typeName, customRequestField.getOwnerClassName()) && (customRequestField.isIgnore()) && !isResp) { + if (customRequestField != null && JavaClassUtil.isTargetChildClass(typeName, customRequestField.getOwnerClassName()) && (customRequestField.isIgnore()) && !isResp) { continue; } if (customResponseField != null && JavaClassUtil.isTargetChildClass(typeName, customResponseField.getOwnerClassName()) && (customResponseField.isIgnore()) && isResp) { diff --git a/src/main/java/com/power/doc/helper/ParamsBuildHelper.java b/src/main/java/com/power/doc/helper/ParamsBuildHelper.java index 2a30b6f..fee4193 100644 --- a/src/main/java/com/power/doc/helper/ParamsBuildHelper.java +++ b/src/main/java/com/power/doc/helper/ParamsBuildHelper.java @@ -115,6 +115,7 @@ public class ParamsBuildHelper { paramList.addAll(buildParams(globGicName[0], pre, nextLevel, isRequired, isResp, registryClasses, projectBuilder, groupClasses, pid, jsonRequest)); } else { + Map ignoreFields = JavaClassUtil.getClassJsonIgnoreFields(cls); out: for (DocJavaField docField : fields) { String maxLength = null; @@ -122,7 +123,11 @@ public class ParamsBuildHelper { if (field.isTransient() && skipTransientField) { continue; } - String fieldName = field.getName(); + String fieldName = docField.getFieldName(); + if (ignoreFields.containsKey(fieldName)) { + continue; + } + String subTypeName = docField.getFullyQualifiedName(); if ((responseFieldToUnderline && isResp) || (requestFieldToUnderline && !isResp)) { fieldName = StringUtil.camelToUnderline(fieldName); @@ -147,12 +152,12 @@ public class ParamsBuildHelper { } boolean strRequired = false; int annotationCounter = 0; - CustomField customResponseField = responseFieldMap.get(simpleName + "."+ fieldName); + CustomField customResponseField = responseFieldMap.get(simpleName + "." + fieldName); if (customResponseField != null && JavaClassUtil.isTargetChildClass(simpleName, customResponseField.getOwnerClassName()) && (customResponseField.isIgnore()) && isResp) { continue; } - CustomField customRequestField = projectBuilder.getCustomReqFieldMap().get(simpleName +"."+fieldName); + CustomField customRequestField = projectBuilder.getCustomReqFieldMap().get(simpleName + "." + fieldName); if (customRequestField != null && JavaClassUtil.isTargetChildClass(simpleName, customRequestField.getOwnerClassName()) && (customRequestField.isIgnore()) && !isResp) { continue; diff --git a/src/main/java/com/power/doc/model/DocJavaField.java b/src/main/java/com/power/doc/model/DocJavaField.java index 7090b40..5614030 100644 --- a/src/main/java/com/power/doc/model/DocJavaField.java +++ b/src/main/java/com/power/doc/model/DocJavaField.java @@ -69,6 +69,11 @@ public class DocJavaField { */ private String actualJavaType; + /** + * field name + */ + private String fieldName; + private boolean array; private boolean primitive; @@ -199,4 +204,13 @@ public class DocJavaField { public void setEnum(boolean anEnum) { isEnum = anEnum; } + + public String getFieldName() { + return fieldName; + } + + public DocJavaField setFieldName(String fieldName) { + this.fieldName = fieldName; + return this; + } } diff --git a/src/main/java/com/power/doc/utils/JavaClassUtil.java b/src/main/java/com/power/doc/utils/JavaClassUtil.java index 2fccef3..8888144 100644 --- a/src/main/java/com/power/doc/utils/JavaClassUtil.java +++ b/src/main/java/com/power/doc/utils/JavaClassUtil.java @@ -25,6 +25,7 @@ package com.power.doc.utils; import com.power.common.util.CollectionUtil; import com.power.common.util.StringUtil; import com.power.doc.constants.DocAnnotationConstants; +import com.power.doc.constants.DocGlobalConstants; import com.power.doc.constants.DocValidatorAnnotationEnum; import com.power.doc.constants.ValidatorAnnotations; import com.power.doc.model.DocJavaField; @@ -89,6 +90,7 @@ public class JavaClassUtil { String comment = javaMethod.getComment(); JavaField javaField = new DefaultJavaField(javaMethod.getReturns(), methodName); DocJavaField docJavaField = DocJavaField.builder() + .setFieldName(methodName) .setJavaField(javaField) .setComment(comment) .setDocletTags(javaMethod.getTags()) @@ -129,16 +131,23 @@ public class JavaClassUtil { DocJavaField docJavaField = addedFields.get(methodName); docJavaField.setAnnotations(method.getAnnotations()); docJavaField.setComment(comment); + docJavaField.setFieldName(methodName); addedFields.put(methodName, docJavaField); } } for (JavaField javaField : cls1.getFields()) { String fieldName = javaField.getName(); String subTypeName = javaField.getType().getFullyQualifiedName(); + if (javaField.isStatic() || "this$0".equals(fieldName) || JavaClassValidateUtil.isIgnoreFieldTypes(subTypeName)) { continue; } + if (fieldName.startsWith("is") && ("boolean".equals(subTypeName) + || DocGlobalConstants.JAVA_BOOLEAN.equals(subTypeName))) { + fieldName = StringUtil.firstToLowerCase(fieldName.substring(2)); + } + DocJavaField docJavaField = DocJavaField.builder(); boolean typeChecked = false; String gicName = javaField.getType().getGenericCanonicalName(); @@ -174,7 +183,8 @@ public class JavaClassUtil { docJavaField.setComment(javaField.getComment()) .setJavaField(javaField).setFullyQualifiedName(subTypeName) .setGenericCanonicalName(gicName).setActualJavaType(actualType) - .setAnnotations(javaField.getAnnotations()); + .setAnnotations(javaField.getAnnotations()) + .setFieldName(fieldName); if (addedFields.containsKey(fieldName)) { addedFields.put(fieldName, docJavaField); continue; @@ -518,4 +528,39 @@ public class JavaClassUtil { } return false; } + + public static Map getClassJsonIgnoreFields(JavaClass cls) { + List classAnnotation = cls.getAnnotations(); + Map ignoreFields = new HashMap<>(); + for (JavaAnnotation annotation : classAnnotation) { + String simpleAnnotationName = annotation.getType().getValue(); + if (DocAnnotationConstants.SHORT_JSON_IGNORE_PROPERTIES.equalsIgnoreCase(simpleAnnotationName)) { + return JavaClassUtil.getJsonIgnoresProp(annotation, DocAnnotationConstants.VALUE_PROP); + } + if (DocAnnotationConstants.SHORT_JSON_TYPE.equals(simpleAnnotationName)) { + return JavaClassUtil.getJsonIgnoresProp(annotation, DocAnnotationConstants.IGNORE_PROP); + } + } + return ignoreFields; + } + + public static Map getJsonIgnoresProp(JavaAnnotation annotation, String propName) { + Map ignoreFields = new HashMap<>(); + Object ignoresObject = annotation.getNamedParameter(propName); + if (Objects.isNull(ignoresObject)) { + return ignoreFields; + } + if (ignoresObject instanceof String) { + String prop = StringUtil.removeQuotes(ignoresObject.toString()); + ignoreFields.put(prop, null); + return ignoreFields; + } + List ignorePropList = (LinkedList) ignoresObject; + for (String str : ignorePropList) { + String prop = StringUtil.removeQuotes(str); + ignoreFields.put(prop, null); + } + return ignoreFields; + } } +