diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/factory/ClassDetailMetadataFactory.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/factory/ClassDetailMetadataFactory.java index 0a8a38aa0..170533ceb 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/factory/ClassDetailMetadataFactory.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/factory/ClassDetailMetadataFactory.java @@ -75,28 +75,8 @@ public class ClassDetailMetadataFactory { case OBJECT: // 如果是实体对象,则描述实体对象的所有字段信息 Class objectClass = (Class) fieldType; - Field[] fields = objectClass.getDeclaredFields(); fieldMetadata = new LinkedHashSet<>(); - - // 在处理Object中所有字段之前,将当前父类放进context,所有子字段不能含有父类的类型,否则会递归 - MetadataContext.addClassRecord(uuid, objectClass.getName()); - - for (Field field : fields) { - FieldMetadata fieldInfo; - - // 判断字段是否是基础字段例如serialVersionUID,或者delFlag等字段 - if (ScannerConstants.DONT_PARSE_FIELD.contains(field.getName())) { - continue; - } - - // 判断该实体是否被解析过,防止无限递归解析实体 - if (MetadataContext.ensureFieldClassHaveParse(uuid, field.getGenericType())) { - fieldInfo = FieldDescriptionUtil.createBasicMetadata(field, uuid); - } else { - fieldInfo = FieldDescriptionUtil.createFieldMetadata(field, uuid); - } - fieldMetadata.add(fieldInfo); - } + processClassFields(objectClass, fieldMetadata, uuid); break; case OBJECT_WITH_GENERIC: // 如果是带泛型的Object实体类型 @@ -170,4 +150,40 @@ public class ClassDetailMetadataFactory { } } + /** + * 获取指定类的字段信息,增加可以获取父级的类的字段 + * + * @author fengshuonan + * @since 2022/1/14 18:51 + */ + private static void processClassFields(Class clazz, Set fieldMetadata, String uuid) { + if (clazz == null || clazz == Object.class) { + return; + } + + // 在处理Object中所有字段之前,将当前父类放进context,所有子字段不能含有父类的类型,否则会递归 + MetadataContext.addClassRecord(uuid, clazz.getName()); + + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + FieldMetadata fieldInfo; + + // 判断字段是否是基础字段例如serialVersionUID,或者delFlag等字段 + if (ScannerConstants.DONT_PARSE_FIELD.contains(field.getName())) { + continue; + } + + // 判断该实体是否被解析过,防止无限递归解析实体 + if (MetadataContext.ensureFieldClassHaveParse(uuid, field.getGenericType())) { + fieldInfo = FieldDescriptionUtil.createBasicMetadata(field, uuid); + } else { + fieldInfo = FieldDescriptionUtil.createFieldMetadata(field, uuid); + } + fieldMetadata.add(fieldInfo); + } + + // 递归处理父类 + processClassFields(clazz.getSuperclass(), fieldMetadata, uuid); + } + }