- 枚举类需要实现公共的映射接口
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;
}
}
}
- 自定义映射注解
java
复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EnumMapping {
Class<? extends Enum<?>> enumClass();
}
- 自定义序列化过滤器
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) {
}
}
}
}
- 用装饰器来处理返回对象
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>() {});
}
}
- 如何使用
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);
}