From 617e16fa83188946be0e104b656d9dcbb56b37f3 Mon Sep 17 00:00:00 2001 From: stylefeng Date: Sun, 4 Aug 2024 17:19:47 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.3.0=E3=80=91=E3=80=90scanner?= =?UTF-8?q?=E3=80=91=E6=9B=B4=E6=96=B0=E5=AD=97=E6=AE=B5=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=88=B6=E7=BA=A7=E7=B1=BB=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/ClassDetailMetadataFactory.java | 58 ++++++++++++------- 1 file changed, 37 insertions(+), 21 deletions(-) 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); + } + }