1、編寫翻譯字典@Dict
/** * 數據字典翻譯注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Dict { public static final String SOURCE_NAME = "Id"; public static final String TARGET_NAME = "Name"; }
2、編寫翻譯字段注解@DictItem
@Target({ FIELD }) @Retention(RUNTIME) public @interface DictItem { CategoryEnum value(); }
3、編寫切面實現翻譯
@Aspect @Component @Slf4j public class DictAspect { @Reference private SysDictionaryDubboService sysDictionaryDubboService; @Pointcut("execution(* com.bgy.order.controller..*(..))") public void packagePointCut(){} /** * 返回增強:目標方法正常執行完畢時執行 * * @param joinPoint * @param result */ @AfterReturning(pointcut = "packagePointCut() && @annotation(dict)", returning = "result") public void afterReturningMethod(JoinPoint joinPoint, Dict dict, Object result) { processData(result); } private void processData(Object result) { List<String> needProcessFieldList = new ArrayList<>(); Map<String,Field> fieldMap = new HashMap<>(); if (result instanceof Page) { for(Object object : ((Page<?>)result).getRecords()){ getProcessFieldList(object, needProcessFieldList, fieldMap); processSingleData(object, needProcessFieldList, fieldMap); } } else if(result instanceof List) { for(Object object : (List<?>) result) { getProcessFieldList(object, needProcessFieldList, fieldMap); processSingleData(object, needProcessFieldList, fieldMap); } } else if(result instanceof Map){ for(Object obj : ((Map<?,?>)result).values()){ processData(obj); } } else if(result instanceof Serializable){ getProcessFieldList(result, needProcessFieldList,fieldMap); processSingleData(result, needProcessFieldList,fieldMap); } } private void getProcessFieldList(Object result, List<String> needProcessFieldList, Map<String,Field> fieldMap) { if(!(result instanceof Serializable)){ return; } List<Field> declaredFields = getAllField(result.getClass()); if (CollectionUtils.isEmpty(declaredFields)) { return; } for(Field field : declaredFields){ fieldMap.put(field.getName(), field); DictItem dictItem = field.getAnnotation(DictItem.class); if(dictItem != null){ needProcessFieldList.add(field.getName()); } } } private List<Field> getAllField(Class<?> clz){ List<Field> fieldList = new ArrayList<>() ; Class<?> tempClass = clz; while (tempClass != null) {//當父類為null的時候說明到達了最上層的父類(Object類). fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields())); tempClass = tempClass.getSuperclass(); //得到父類,然后賦給自己 } return fieldList; } private void processSingleData(Object data, List<String> needProcessFieldList,Map<String,Field> fieldMap){ for(String fieldName : needProcessFieldList){ setDataDesc(data, fieldMap, fieldName); } } private void setDataDesc(Object data, Map<String, Field> fieldMap, String fieldName) { try { Field field = fieldMap.get(fieldName); Class<?> type = fieldMap.get(fieldName).getType(); if(!type.equals(Integer.class)){ return; } field.setAccessible(true); Integer dictKey = (Integer)field.get(data); DictItem dictItem = field.getAnnotation(DictItem.class); CategoryEnum categoryEnum = dictItem.value(); if(!fieldName.endsWith(Dict.SOURCE_NAME)){ return; } String targetFiledName = fieldName.replace(Dict.SOURCE_NAME,Dict.TARGET_NAME); Field findField = fieldMap.get(targetFiledName); if (findField == null || !findField.getType().equals(String.class)) { return ; } findField.setAccessible(true); String dictValue = sysDictionaryDubboService.getDictName(categoryEnum, dictKey); findField.set(data, dictValue); } catch (Exception e) { log.error("注入字典名稱報錯", e); } }
4、測試