diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/EntityFieldUtil.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/EntityFieldUtil.java new file mode 100644 index 000000000..064ce7fa5 --- /dev/null +++ b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/EntityFieldUtil.java @@ -0,0 +1,61 @@ +package cn.stylefeng.roses.kernel.db.api.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseBusinessEntity; +import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseExpandFieldEntity; + +import java.lang.reflect.Field; + +/** + * 实体字段获取工具类 + * + * @author fengshuonan + * @since 2023/5/31 0:08 + */ +public class EntityFieldUtil { + + /** + * 获取指定对象的类中是否包含了指定字段名 + *
+ * 主要用在BaseExpandFieldEntity的子类中获取delFlag字段 + * 因为直接用getField()或者直接用getDeclaredField()都不能获取到父级的private属性的Field信息 + * + * @author fengshuonan + * @since 2023/5/31 0:09 + */ + public static Field getDeclaredField(Object declareObject, String fieldName) throws NoSuchFieldException { + if (ObjectUtil.isEmpty(declareObject)) { + throw new NoSuchFieldException(); + } + + Class> objectClass = declareObject.getClass(); + + // 先获取本类中是否有指定字段 + try { + + return objectClass.getDeclaredField(fieldName); + + } catch (NoSuchFieldException e) { + + // 本类中没有这个字段,再去逐级获取父级类中是否有这个字段 + Class> superclass = objectClass.getSuperclass(); + + // 如果父级是BaseExpandFieldEntity,则直接获取父父级字段 + if (superclass.equals(BaseExpandFieldEntity.class)) { + Class> baseBusinessEntityClass = superclass.getSuperclass(); + return baseBusinessEntityClass.getDeclaredField(fieldName); + } + + // 如果父级是BaseBusinessEntity,则直接获取父级的字段 + else if (superclass.equals(BaseBusinessEntity.class)) { + return superclass.getDeclaredField(fieldName); + } + + // 其他情况不做判断 + else { + throw e; + } + } + } + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/fieldfill/CustomMetaObjectHandler.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/fieldfill/CustomMetaObjectHandler.java index a5b65215c..070b30b44 100644 --- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/fieldfill/CustomMetaObjectHandler.java +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/fieldfill/CustomMetaObjectHandler.java @@ -28,6 +28,7 @@ import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.db.api.constants.DbFieldConstants; +import cn.stylefeng.roses.kernel.db.api.util.EntityFieldUtil; import cn.stylefeng.roses.kernel.rule.enums.StatusEnum; import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; @@ -152,7 +153,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { Object originalObject = metaObject.getOriginalObject(); try { // 获取delFlag字段的类型,如果是枚举类型,则设置枚举 - Field declaredField = originalObject.getClass().getDeclaredField(DbFieldConstants.DEL_FLAG); + Field declaredField = EntityFieldUtil.getDeclaredField(originalObject, DbFieldConstants.DEL_FLAG); if (ClassUtil.isEnum(declaredField.getType())) { setFieldValByName(DbFieldConstants.DEL_FLAG, YesOrNotEnum.N, metaObject); } else { @@ -177,7 +178,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { Object originalObject = metaObject.getOriginalObject(); try { // 获取statusFlag字段的类型,如果是枚举类型,则设置枚举 - Field declaredField = originalObject.getClass().getDeclaredField(DbFieldConstants.STATUS_FLAG); + Field declaredField = EntityFieldUtil.getDeclaredField(originalObject, DbFieldConstants.STATUS_FLAG); if (ClassUtil.isEnum(declaredField.getType())) { setFieldValByName(DbFieldConstants.STATUS_FLAG, StatusEnum.ENABLE, metaObject); } else {