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

定义结构及接口

public class CodeItem { private String _itemText; private Object _itemValue; public CodeItem(){}public CodeItem(String itemText, Object itemValue){ _itemText = itemText; _itemValue = https://www.it610.com/article/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 = https://www.it610.com/article/_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> codeDic = new HashMap<>(); public static void initCodeItem(Class runtimeClass){ List filterClassList = new ArrayList<>(); filterClassList.add(IConvertEnumToCodeItem.class); List> enumClassList = ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(),filterClassList); try{ for (Class clazz:enumClassList) { if (clazz.isEnum()){ List codeItemList = new ArrayList<>(); Object[] oo = clazz.getEnumConstants(); for (Object obj : oo) { String itemText = ""; Object itemValue = https://www.it610.com/article/null; List 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 = https://www.it610.com/article/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(); } }

系统启动扫描 【SpringBoot枚举转化代码项统一解决方案】新建class实现ApplicationRunner重写run方法,通过Order注解确定执行顺序
@Component @Order(value = https://www.it610.com/article/99) public class StartUpContextimplements ApplicationRunner { @Autowired private ApplicationContext context; @Override public void run(ApplicationArguments args) throws Exception { Map 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 params){ String codeName = ConvertOp.convert2String(params.get("codeName")); if(StringUtil.isEmpty(codeName)){ return Result.errorResult().add("msg","代码项名称不能为空"); } List 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 = https://www.it610.com/article/{"codeName": codeName } JsonAjax_Sync(JSON.stringify(data), codeItemUrl, function (result, status) { if (callback) { callback(result, status); } }) } //获取代码项详细实例 var pageData = https://www.it610.com/article/{ 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 =https://www.it610.com/article/= codeValue) { text = element.itemText } }); return text; }//列表渲染代码项实例

    推荐阅读