SpringBoot枚举转化代码项统一解决方案

简介: SpringBoot枚举转化代码项统一解决方案

定义结构及接口

public class CodeItem {
   
    private String _itemText;
    private Object _itemValue;

    public CodeItem(){
   

    }

    public CodeItem(String itemText, Object itemValue){
   
        _itemText = itemText;
        _itemValue = itemValue;
    }

    public String get_itemText() {
   
        return _itemText;
    }

    public void set_itemText(String _itemText) {
   
        this._itemText = _itemText;
    }

    public Object get_itemValue() {
   
        return _itemValue;
    }

    public void set_itemValue(Object _itemValue) {
   
        this._itemValue = _itemValue;
    }
}
public interface IConvertEnumToCodeItem {
   
    String getCodeName();
}

规范化枚举定义

定义枚举包含name和value字段,实现枚举转换接口,返回代码项名称

public enum EnableOrDisable implements IConvertEnumToCodeItem {
   
        Enable(100, "启用"), Disabele(300, "禁用");
        private int _value;
        private String _name;
        private EnableOrDisable(int value, String name) {
   
            set_value(value);
            set_name((name));
        }
        public int get_value() {
   
            return _value;
        }
        public void set_value(int _value) {
   
            this._value = _value;
        }
        public String get_name() {
   
            return _name;
        }
        public void set_name(String _name) {
   
            this._name = _name;
        }
        @Override
        public String toString() {
   
            return _name;
        }

        @Override
        public String getCodeName() {
   
            return "启用禁用";
        }
    }

扫描转换枚举类

扫描项目包下的所有实现IConvertEnumToCodeItem接口需要转化的枚举类,拿到所有枚举项,调用接口的getCodeName方法获取代码项名称,最后组成代码项

public class CodeItemUtil {
   
    private static HashMap<String,List<CodeItem>> codeDic = new HashMap<>();

    public static void initCodeItem(Class runtimeClass){
   
        List<Class> filterClassList = new ArrayList<>();
        filterClassList.add(IConvertEnumToCodeItem.class);
        List<Class<?>> enumClassList = ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(),filterClassList);
        try{
   
            for (Class clazz:enumClassList) {
   
                if (clazz.isEnum()){
   
                    List<CodeItem> codeItemList = new ArrayList<>();
                    Object[] oo = clazz.getEnumConstants();
                    for (Object obj : oo) {
   
                        String itemText = "";
                        Object itemValue = null;
                        List<Field> fs = Arrays.asList(clazz.getDeclaredFields());
                        for (Field field:fs) {
   
                            field.setAccessible(true);
                            if(field.getName().equals("_name")){
   
                                itemText = ConvertOp.convert2String(field.get(obj));
                            }else if(field.getName().equals("_value")){
   
                                itemValue = field.get(obj);
                            }
                        }
                        if(!StringUtil.isEmpty(itemText) && null!=itemValue){
   
                            CodeItem codeItem = new CodeItem(itemText,itemValue);
                            codeItemList.add(codeItem);
                        }
                    }
                    Method getCodeNameMethod = clazz.getDeclaredMethod("getCodeName");
                    String codeName = ConvertOp.convert2String(getCodeNameMethod.invoke(oo[0]));
                    if(codeDic.containsKey(codeName)){
   
                        throw new Exception("存在同样的枚举代码项,名称:"+codeName);
                    }
                    codeDic.put(codeName,codeItemList);
                }
            }
            if(codeDic.keySet().size()>0){
   
                System.out.println("扫描并初始化枚举代码项成功,代码项数量:"+codeDic.keySet().size()+"个");
            }
        }catch (Exception e){
   
            e.printStackTrace();
        }
    }

系统启动扫描

新建class实现ApplicationRunner重写run方法,通过Order注解确定执行顺序

@Component
@Order(value = 99)
public class StartUpContext  implements ApplicationRunner {
   
    @Autowired
    private ApplicationContext context;

    @Override
    public void run(ApplicationArguments args) throws Exception {
   
        Map<String, Object> annotatedBeans = context.getBeansWithAnnotation(SpringBootApplication.class);
        Class bootClass =  annotatedBeans.values().toArray()[0].getClass();
        CodeItemUtil.initCodeItem(bootClass);
    }
}

实际应用

通用接口

@RestController
@RequestMapping("/common/enumcode")
public class EnumCodeController extends BaseController {
   
    @ResponseBody
    @PostMapping("/getCodeDetail")
    public Object getCodeDetail(@RequestBody Map<String, Object> params){
   
        String codeName = ConvertOp.convert2String(params.get("codeName"));
        if(StringUtil.isEmpty(codeName)){
   
            return Result.errorResult().add("msg","代码项名称不能为空");
        }
        List<CodeItem> codeItemList = CodeItemUtil.getCodeList(codeName);
        if(null==codeItemList){
   
            return Result.errorResult().add("msg","代码项不存在");
        }else{
   
            return Result.okResult().add("obj",codeItemList);
        }

    }
}

页面调用

//获取代码项详细
function bindEnumCode(codeName,callback) {
   
    var codeItemUrl = apiFrameUrl + "/common/enumcode/getCodeDetail";
    var data = {
   
        "codeName": codeName
    }
    JsonAjax_Sync(JSON.stringify(data), codeItemUrl, function (result, status) {
   
        if (callback) {
   
            callback(result, status);
        }
    })
}
//获取代码项详细实例
 var pageData = {
   
        moduleStatusList: []
 }
 bindEnumCode("模块状态", function(result, status) {
   
    Vue.set(pageData, "moduleStatusList", result.data.obj);
 });
//列表渲染代码项
Vue.prototype.getCodeText = function (page, codeName, codeValue) {
  var text = "";
  if (!page[codeName]) {
    bindEnumCode(codeName, function (result, status) {
      page[codeName] = result.data.obj;
    })
  }
  page[codeName].forEach(element => {
    if (element.itemValue == codeValue) {
      text = element.itemText
    }
  });
  return text;
}

//列表渲染代码项实例
<el-table-column prop="moduleStatus" align="center" header-align="center" label="模块状态" width="100">
    <template slot-scope="scope">
       <span v-text="getCodeText(this,'模块状态',scope.row.moduleStatus)"></span>
    </template>
</el-table-column>
目录
相关文章
|
2月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
277 3
|
5月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1017 1
Spring boot 使用mybatis generator 自动生成代码插件
|
5月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
338 0
|
10月前
|
XML 前端开发 Java
SpringBoot整合Flowable【04】- 通过代码控制流程流转
本文介绍了如何使用Flowable的Java API控制流程流转,基于前文构建的绩效流程模型。首先,通过Flowable-UI导出模型文件并部署到Spring Boot项目中。接着,详细讲解了如何通过代码部署、启动和审批流程,涉及`RepositoryService`、`RuntimeService`和`TaskService`等核心服务类的使用。最后,通过实际操作演示了流程从部署到完成的全过程,并简要说明了相关数据库表的变化。本文帮助读者初步掌握Flowable在实际业务中的应用,后续将深入探讨更多高级功能。
1541 0
SpringBoot整合Flowable【04】-  通过代码控制流程流转
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
597 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
3136 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
3109 2
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
缓存 监控 Java
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码