首页 > 其他分享 >利用反射扫描枚举生成数据字典数据

利用反射扫描枚举生成数据字典数据

时间:2024-09-27 09:21:45浏览次数:10  
标签:code return String label 枚举 数据 字典

在开发过程中经常遇到既需要维护枚举来完成各种条件判断,又需要维护数据字典供前端使用,维护数据字典的另一个用处是可以修改数据字典的label而无需调整代码,但是这种两边维护的方式非常浪费人力资源,甚至有时部署程序忘了维护数据字典导致线上环境出现无法正常显示等问题。为解决上述问题,提高自动化,减少上线bug,六哥在这里提供一个通过枚举反射的数据字典的方案,仅供参考。

第一步

定义一个注解,用于定义数据字典类型名称和字典类型编码

public @interface DictDefine {

    /**
     * 字典类型名称
     * @return
     */
    String name();

    /**
     * 字典类型code(默认使用类名)
     * @return
     */
    String code() default "";

}

第二步

定义一个接口用于规定字典value和字典label的获取方法

public interface IDict {
    /**
     * 字典值
     * @return
     */
    Integer getValue();

    /**
     * 字典标签
     * @return
     */
    String getLabel();
}

第三步

定义枚举

@DictDefine(name = "用户类型")
public enum  UserTypeEnum implements IDict {

    member("会员", 0),
    merchants("商户", 1),
    operator("运营商", 2);

    MallUserTypeEnum(String label, int value){
        this.label = label;
        this.value = value;
    }

    private final String label;
    private final int value;

    @Override
    public Integer getValue() {
        return this.value;
    }

    @Override
    public String getLabel() {
        return this.label;
    }

}

第四步

使用spring类扫描工具扫描指定包下的枚举类,转化为数据字典。这里是一次性扫描所有枚举放进map缓存,读取时只需通过字典code即可获取字典项,也可根据需要读取哪个就生成哪个,此处代码主要是提供扫描枚举生成数据字典的方法。

public static Map<String, List<DictItem>> scanEnumToDict() {
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
    scanner.addIncludeFilter((metadataReader, metadataReaderFactory) -> true);
    Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents("cn.lg.soar.**.enums");

    Map<String, List<DictItem>> map = new HashMap<>(candidateComponents.size());
    for (BeanDefinition beanDefinition : candidateComponents) {
        Class<?> x = Class.forName(beanDefinition.getBeanClassName());
        // 判断是否是枚举且继承了字典接口
        if (!Enum.class.isAssignableFrom(x) || !IDict.class.isAssignableFrom(x)) {
            continue;
        }
        // 判断是否有字典注解
        DictDefine annotation = x.getAnnotation(DictDefine.class);
        if (annotation == null) {
            continue;
        }
        // 获取字典code
        String code = annotation.code();
        code = "".equals(code) ? x.getSimpleName() : code;
        // 生成字典项
        IDict[] constants = (IDict[])x.getEnumConstants();
        List<DictItem> items = new ArrayList<>(constants.length);
        for (IDict d : constants) {
            DictItem item = new DictItem();
            item.setValue(d.getValue());
            item.setLabel(d.getLabel());
            items.add(item);
        }
        // 缓存
        map.put(code, items);
    }

    return map;
}

尾声

本文主要提供如何通过反射扫描枚举生成数据字典的示例,如果有更好的方案欢迎在评论区交流探讨,本文代码来源六哥开源前后端开源框架lg-soar,如果您觉得对您有所帮助欢迎访问https://gitee.com/lgx1992/lg-soar给lg-soar一个star

标签:code,return,String,label,枚举,数据,字典
From: https://blog.csdn.net/qq_26913569/article/details/142583674

相关文章

  • nacos配置持久化到mysql数据库
    以版本2.4.1为例,要实现Nacos2.4.1的配置持久化,你需要按照以下步骤操作:准备数据库:首先,确保你已经安装并配置好了MySQL数据库,并且版本符合Nacos的要求(MySQL5.6及以上)。创建数据库:在MySQL中创建一个新的数据库,例如命名为nacos。执行SQL脚本:从Nacos的conf......
  • log型数据结构优化DP解题报告(uoj)
    交作业用T220417最长公共上升子序列不难看出状态同最长公共子序列,但由于上升条件限制,加一个限制:\(f_{i,j}\)表示\(a_{1...i}\)匹配\(b_{1...j}\)且\(a_i\)必须做结尾的最长公共上升子序列长度转移方程为\(f_{i,j}=f_{i,j-1}\)(if\(a_i\neqb_j\))\(f_{i,j}=\max_{k......
  • 数据结构之——队列
    一、队列概述        队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。例如军训的时候,都排成一列,有头有尾。假设你......
  • 读数据湖仓01让数据可信
    1. 让数据可信1.1. 每个终端用户(EndUser)都有一个共同的需求:访问想要的数据1.2. 真的能够相信我正在访问的这些数据吗?1.2.1. 终端用户很快就会发现,访问数据和相信正在访问的数据是两回事1.2.2. 访问数据和相信数据不是同一回事1.2.3. 如果数据不可信,可能会导......
  • 淘宝客APP的数据同步与一致性保障
    淘宝客APP的数据同步与一致性保障大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来讨论淘宝客APP中的数据同步与一致性保障问题。随着系统复杂度的提升,特别是在分布式架构的情况下,如何确保数据同步和一致性成为了一个重要的技术挑战。......
  • 易优cms网站数据库搬家,出现数据表或视图不存在,[错误代码]SQLSTATE[42S02]: Base table
    当你在迁移易优CMS数据库后遇到“数据表或视图不存在”的错误提示时,通常是因为目标数据库中缺少某些表或视图。以下是一些具体的解决步骤:步骤1:确认数据库表结构检查数据库表使用数据库管理工具(如phpMyAdmin)打开目标数据库。检查数据库中是否存在相关表。步骤2:导出并......
  • SQL sever 数据库与表的建立#基础操作
    一:创建数据库利用SQLServerManagementStudio创建数据库,名称为“学生选课”打开sqlsever进行如下操作二:创建表在学生选课数据库中建立学生表Ctrl+s(保存)保存后,进行刷新就可看到学生表。三:数据的录入与修改随机输入下面的数据。查询数据新建查询,输入以上代......
  • 易优CMS数据库链接失败?-eyoucms
    当出现数据库连接失败的提示时,通常是因为数据库配置信息不正确。为了解决这个问题,你需要检查并更新数据库配置文件。具体步骤如下:检查并更新数据库配置打开数据库配置文件打开根目录下的 application/database.php 文件。检查并修改数据库配置核对并修改以下配置项......
  • 易优CMS请重启MYSQL数据库,或者联系空间服务商处理[错误报错·····]出现以下提示该
    当你遇到“请重启MYSQL数据库,或者联系空间服务商处理”的错误提示时,通常意味着数据库连接存在问题,可能是由于数据库服务未启动,或者是数据库配置信息不正确导致的。以下是一些基本的解决步骤:步骤1:检查数据库服务状态确认数据库服务是否启动如果你有访问服务器的权限,可以通......
  • 易优CMS数据表和视图不存在该怎么办?-eyoucms
    当你遇到数据表或视图不存在的问题时,可以通过以下步骤来解决:具体步骤确认缺失的数据表首先打开数据库管理工具(如phpMyAdmin),检查报错中提到的数据表是否存在。如果缺失的数据表是 ey_product_spec_data_handle,则需要创建该表。获取SQL语句从官方下载最新的数据库......