diff --git a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/continew/starter/data/mybatis/plus/service/impl/ServiceImpl.java b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/continew/starter/data/mybatis/plus/service/impl/ServiceImpl.java index 54e9ce98..63158108 100644 --- a/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/continew/starter/data/mybatis/plus/service/impl/ServiceImpl.java +++ b/continew-starter-data/continew-starter-data-mybatis-plus/src/main/java/top/continew/starter/data/mybatis/plus/service/impl/ServiceImpl.java @@ -36,13 +36,25 @@ */ public class ServiceImpl, T> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl implements IService { - protected final List entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass()); + private List entityFields; @Override public T getById(Serializable id) { return this.getById(id, true); } + /** + * 获取当前实体类型字段 + * + * @return 当前实体类型字段列表 + */ + public List getEntityFields() { + if (this.entityFields == null) { + this.entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass()); + } + return this.entityFields; + } + /** * 根据 ID 查询 * diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-mp/src/main/java/top/continew/starter/extension/crud/service/impl/BaseServiceImpl.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-mp/src/main/java/top/continew/starter/extension/crud/service/impl/BaseServiceImpl.java index 8356de25..9e5c4cd5 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-mp/src/main/java/top/continew/starter/extension/crud/service/impl/BaseServiceImpl.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-mp/src/main/java/top/continew/starter/extension/crud/service/impl/BaseServiceImpl.java @@ -68,17 +68,16 @@ */ public abstract class BaseServiceImpl, T extends BaseIdDO, L, D, Q, C> extends ServiceImpl implements BaseService { - private final Class[] typeArgumentCache = ClassUtils.getTypeArguments(this.getClass()); - protected final Class listClass = this.currentListClass(); - protected final Class detailClass = this.currentDetailClass(); - protected final Class queryClass = this.currentQueryClass(); - private final List queryFields = ReflectUtils.getNonStaticFields(this.queryClass); + private Class listClass; + private Class detailClass; + private Class queryClass; + private List queryFields; @Override public PageResp page(Q query, PageQuery pageQuery) { QueryWrapper queryWrapper = this.buildQueryWrapper(query); IPage page = baseMapper.selectPage(pageQuery.toPage(), queryWrapper); - PageResp pageResp = PageResp.build(page, listClass); + PageResp pageResp = PageResp.build(page, this.getListClass()); pageResp.getList().forEach(this::fill); return pageResp; } @@ -91,7 +90,7 @@ public List> tree(Q query, SortQuery sortQuery, boolean isSimple) { } // 如果构建简单树结构,则不包含基本树结构之外的扩展字段 TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG; - TreeField treeField = listClass.getDeclaredAnnotation(TreeField.class); + TreeField treeField = this.getListClass().getDeclaredAnnotation(TreeField.class); if (!isSimple) { // 根据 @TreeField 配置生成树结构配置 treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField); @@ -104,7 +103,7 @@ public List> tree(Q query, SortQuery sortQuery, boolean isSimple) { tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey()))); tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey()))); if (!isSimple) { - List fieldList = ReflectUtils.getNonStaticFields(listClass); + List fieldList = ReflectUtils.getNonStaticFields(this.getListClass()); fieldList.removeIf(f -> CharSequenceUtil.equalsAnyIgnoreCase(f.getName(), treeField.value(), treeField .parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey())); fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f @@ -115,7 +114,7 @@ public List> tree(Q query, SortQuery sortQuery, boolean isSimple) { @Override public List list(Q query, SortQuery sortQuery) { - List list = this.list(query, sortQuery, listClass); + List list = this.list(query, sortQuery, this.getListClass()); list.forEach(this::fill); return list; } @@ -123,7 +122,7 @@ public List list(Q query, SortQuery sortQuery) { @Override public D get(Long id) { T entity = super.getById(id, false); - D detail = BeanUtil.toBean(entity, detailClass); + D detail = BeanUtil.toBean(entity, this.getDetailClass()); this.fill(detail); return detail; } @@ -175,9 +174,57 @@ public void delete(List ids) { @Override public void export(Q query, SortQuery sortQuery, HttpServletResponse response) { - List list = this.list(query, sortQuery, detailClass); + List list = this.list(query, sortQuery, this.getDetailClass()); list.forEach(this::fill); - ExcelUtils.export(list, "导出数据", detailClass, response); + ExcelUtils.export(list, "导出数据", this.getDetailClass(), response); + } + + /** + * 获取当前列表信息类型 + * + * @return 当前列表信息类型 + */ + public Class getListClass() { + if (this.listClass == null) { + this.listClass = (Class)ClassUtils.getTypeArguments(this.getClass())[2]; + } + return this.listClass; + } + + /** + * 获取当前详情信息类型 + * + * @return 当前详情信息类型 + */ + public Class getDetailClass() { + if (this.detailClass == null) { + this.detailClass = (Class)ClassUtils.getTypeArguments(this.getClass())[3]; + } + return this.detailClass; + } + + /** + * 获取当前查询条件类型 + * + * @return 当前查询条件类型 + */ + public Class getQueryClass() { + if (this.queryClass == null) { + this.queryClass = (Class)ClassUtils.getTypeArguments(this.getClass())[4]; + } + return this.queryClass; + } + + /** + * 获取当前查询条件类型字段 + * + * @return 当前查询条件类型字段列表 + */ + public List getQueryFields() { + if (this.queryFields == null) { + this.queryFields = ReflectUtils.getNonStaticFields(this.getQueryClass()); + } + return queryFields; } /** @@ -217,7 +264,7 @@ protected void sort(QueryWrapper queryWrapper, SortQuery sortQuery) { } else { checkProperty = property; } - Optional optional = entityFields.stream() + Optional optional = super.getEntityFields().stream() .filter(field -> checkProperty.equals(field.getName())) .findFirst(); ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property); @@ -248,7 +295,7 @@ protected void fill(Object obj) { protected QueryWrapper buildQueryWrapper(Q query) { QueryWrapper queryWrapper = new QueryWrapper<>(); // 解析并拼接查询条件 - return QueryWrapperHelper.build(query, queryFields, queryWrapper); + return QueryWrapperHelper.build(query, this.getQueryFields(), queryWrapper); } /** @@ -307,31 +354,4 @@ protected void afterUpdate(C req, T entity) { protected void afterDelete(List ids) { /* 删除后置处理 */ } - - /** - * 获取当前列表信息类型 - * - * @return 当前列表信息类型 - */ - protected Class currentListClass() { - return (Class)this.typeArgumentCache[2]; - } - - /** - * 获取当前详情信息类型 - * - * @return 当前详情信息类型 - */ - protected Class currentDetailClass() { - return (Class)this.typeArgumentCache[3]; - } - - /** - * 获取当前查询条件类型 - * - * @return 当前查询条件类型 - */ - protected Class currentQueryClass() { - return (Class)this.typeArgumentCache[4]; - } }