用FastJson的Filter自动映射枚举

  1. 枚举类需要实现公共的映射接口
java 复制代码
public interface IDictionaryEnum {
    String getKey();

    String getValue();

    static <T extends Enum> T getEnumByKey(String key, Class<T> enumClzz) {
        if (!IDictionaryEnum.class.isAssignableFrom(enumClzz)) {
            return null;
        } else {
            try {
                T[] enumArray = (Enum[])((Enum[])ReflectUtils.findDeclaredMethod(enumClzz, "values", (Class[])null).invoke((Object)null));
                Enum[] var3 = enumArray;
                int var4 = enumArray.length;

                for(int var5 = 0; var5 < var4; ++var5) {
                    T t = var3[var5];
                    if (t instanceof IDictionaryEnum && ((IDictionaryEnum)t).getKey().equals(key)) {
                        return t;
                    }
                }
            } catch (IllegalAccessException var7) {
                LogManager.getRuntimeLog().warn(var7, "Can not call enum's method-values|{}", new Object[]{enumClzz.getName()});
            } catch (InvocationTargetException var8) {
                LogManager.getRuntimeLog().warn(var8, "Can not call enum's method-values|{}", new Object[]{enumClzz.getName()});
            } catch (NoSuchMethodException var9) {
                LogManager.getRuntimeLog().warn(var9, "Can not find enum's method-values|{}", new Object[]{enumClzz.getName()});
            }

            return null;
        }
    }

    static <T extends Enum> T getEnumByValue(String value, Class<T> enumClzz) {
        if (!IDictionaryEnum.class.isAssignableFrom(enumClzz)) {
            return null;
        } else {
            try {
                T[] enumArray = (Enum[])((Enum[])ReflectUtils.findDeclaredMethod(enumClzz, "values", (Class[])null).invoke((Object)null));
                Enum[] var3 = enumArray;
                int var4 = enumArray.length;

                for(int var5 = 0; var5 < var4; ++var5) {
                    T t = var3[var5];
                    if (t instanceof IDictionaryEnum && ((IDictionaryEnum)t).getValue().equals(value)) {
                        return t;
                    }
                }
            } catch (IllegalAccessException var7) {
                LogManager.getRuntimeLog().warn(var7, "Can not call enum's method-values|{}", new Object[]{enumClzz.getName()});
            } catch (InvocationTargetException var8) {
                LogManager.getRuntimeLog().warn(var8, "Can not call enum's method-values|{}", new Object[]{enumClzz.getName()});
            } catch (NoSuchMethodException var9) {
                LogManager.getRuntimeLog().warn(var9, "Can not find enum's method-values|{}", new Object[]{enumClzz.getName()});
            }

            return null;
        }
    }
}
  1. 自定义映射注解
java 复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EnumMapping {

    Class<? extends Enum<?>> enumClass();
}
  1. 自定义序列化过滤器
java 复制代码
public class EnumSerializeFilter extends BeforeFilter {

    @Override
    public void writeBefore(Object object) {
        if (object instanceof PageInfo) {
            PageInfo<?> pageInfo = (PageInfo<?>) object;
            List<?> list = pageInfo.getList();
            this.convertList(list);
        }

        if (object instanceof List) {
            List<?> list = (List<?>) object;
            this.convertList(list);
        }

        this.convertItem(object);
    }

    private void convertList(List<?> list) {
        if (list == null || list.isEmpty())
            return;

        for (Object item : list) {
            convertItem(item);
        }
    }

    private void convertItem(Object item) {
        if (item == null)
            return;

        Field[] fields = item.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                EnumMapping annotation = field.getAnnotation(EnumMapping.class);
                if (annotation != null && field.getType() == String.class) {
                    field.setAccessible(true);
                    String code = (String) field.get(item);
                    if (code != null) {
                        IDictionaryEnum enumValue =
                            (IDictionaryEnum) IDictionaryEnum.getEnumByKey(code, annotation.enumClass());
                        if (enumValue != null) {
                            field.set(item, enumValue.getValue());
                        }
                    }
                }
            } catch (Exception e) {
            }
        }
    }
}
  1. 用装饰器来处理返回对象
java 复制代码
public class EnumMappingDecorator {

    private static final EnumSerializeFilter FILTER = new EnumSerializeFilter();

    public static <T> PageInfo<T> decorate(PageInfo<T> pageInfo) {
        if (pageInfo == null)
            return null;

        String json = JSON.toJSONString(pageInfo, FILTER);
        return JSON.parseObject(json, new TypeReference<PageInfo<T>>() {});
    }

    public static <T> List<T> decorate(List<T> list) {
        if (list == null || list.isEmpty())
            return list;

        String json = JSON.toJSONString(list, FILTER);
        return JSON.parseObject(json, new TypeReference<List<T>>() {});
    }

    public static <T> T decorate(T object) {
        if (object == null)
            return null;

        String json = JSON.toJSONString(object, FILTER);
        return JSON.parseObject(json, new TypeReference<T>() {});
    }
}
  1. 如何使用
java 复制代码
// 枚举类
public enum PayStatusEnum implements IDictionaryEnum

// 映射对象
@Data
public class xxxBo {
    /**
     *订单号
     */
    private String orderNo;

    /**
     *支付状态
     */
    @EnumMapping(enumClass = PayStatusEnum.class)
    private String payStatus;
}

// 装饰器方法
@Override
    public PageInfo<SelfServiceExportBo> export(ExportTask exportTask, Map<String, Object> condition, Page page) {
        SelfServiceExportDto selfServiceExportDto = EntityConverterUtils.deepConvert(condition,SelfServiceExportDto.class);
        PageInfo<SelfServiceExportBo> pageList =
                selfServiceService.querySelfServiceDetail(selfServiceExportDto, page.getPageNum(), page.getPageSize());
        return EnumMappingDecorator.decorate(pageList);
    }
相关推荐
CQU_JIAKE2 小时前
11.7[高体】
java·后端·spring
apcipot_rain3 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A3 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白5 小时前
LangGraph4j 实战(下)
java
天诰5 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
这个昵称不容易9 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长9 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊10 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼11 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
文丑颜不良啊12 小时前
LeetCode2161~2180题目解析
java·leetcode