Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例
一、自定義注解類
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Dict { /** * 字典編碼 */ String dictName(); /** * 實(shí)體類內(nèi)對(duì)應(yīng)的中文字段名,默認(rèn)為“當(dāng)前字段+Text” * <p> * 例如當(dāng)前字段為“type”,則對(duì)應(yīng)中文字段默認(rèn)為“typeText” */ String dictField() default ""; }
二、AOP切面類
也可不使用切面,定義工具類進(jìn)行處理
import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Slf4j @Aspect @Component public class DictAspect { @Pointcut("execution(* cn.stylefeng.guns.sys.modular.mapper.*.query*(..))") //指定mapper下所有查詢方法 public void doPointcut() { } @AfterReturning(pointcut = "doPointcut()", returning = "result") public void doAfterReturning(JoinPoint pjp, Object result) { try { DictUtils.convertDict(result); } catch (Exception e) { log.error("查詢結(jié)果字典轉(zhuǎn)換失敗", e); } } }
三、字典轉(zhuǎn)換工具類
package cn.hsa.powersi.hygeia.pcloud.DictConverUtils; import cn.hsa.powersi.hygeia.pcloud.api.basic.iteminfo.Dict; import cn.hsa.powersi.hygeia.pcloud.api.sys.dto.SysCodeTableDetailDTO; import cn.hsa.powersi.hygeia.pcloud.basic.itemOwnType.dao.PhcItemTypeDAO; import cn.hsa.powersi.hygeia.pcloud.basic.itemOwnType.entity.PhcItemTypeDO; import cn.hsa.powersi.hygeia.pcloud.basic.storeseat.dao.PhcStoreSeatDAO; import cn.hsa.powersi.hygeia.pcloud.basic.storeseat.entity.PhcStoreSeatDO; import cn.hsa.powersi.hygeia.pcloud.com.base.dto.SelectDTO; import cn.hsa.powersi.hygeia.pcloud.comm.bo.BasDictBO; import cn.hsa.powersi.hygeia.pcloud.sys.bo.SysCodeTableDetailBO; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.Data; import lombok.SneakyThrows; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @ClassName DictUtils * @Description 轉(zhuǎn)碼工具類 需要在DTO中使用注解進(jìn)行轉(zhuǎn)碼 * @Author 陳銳 * @Date 2023/8/21 10:32 * @Version 1.0 */ @Component public class DictUtils { private static SysCodeTableDetailBO sysCodeTableDetailBO; @Resource public void setSysCodeTableDetailBO(SysCodeTableDetailBO sysCodeTableDetailBO) { DictUtils.sysCodeTableDetailBO = sysCodeTableDetailBO; } private static final String DICT_FIELD_SUFFIX = "Name"; public static void convertDict(Object target) { if (target instanceof List) { List<?> objectList = ((List<?>) target); if (CollectionUtils.isNotEmpty(objectList)) { List<DictDefinition> dictDefinitions = getMetadata(objectList.get(0)); if (CollectionUtils.isEmpty(dictDefinitions)) return; Map<String, Map<String, String>> dictMapMap = getCodeTable(); objectList.forEach(t -> doConvertDict(t, dictDefinitions, dictMapMap)); } } else { List<DictDefinition> dictDefinitions = getMetadata(target); if (CollectionUtils.isEmpty(dictDefinitions)) return; Map<String, Map<String, String>> dictMapMap = getCodeTable(); doConvertDict(target, dictDefinitions, dictMapMap); } } /** * 僅獲取一次Dict元數(shù)據(jù),降低多次反射造成的性能消耗 * @param target 目標(biāo)實(shí)體類 * @return Dict元數(shù)據(jù) */ private static List<DictDefinition> getMetadata(Object target) { List<DictDefinition> dictDefinitions = new ArrayList<>(); if (ClassUtils.isPrimitiveOrWrapper(target.getClass()) || target instanceof Map || target instanceof String) { return dictDefinitions; } List<Field> fields = FieldUtils.getAllFieldsList(target.getClass()); for (Field field : fields) { Dict dict = AnnotationUtils.getAnnotation(field, Dict.class); if (dict != null) { DictDefinition dictDefinition = new DictDefinition(); dictDefinition.setDict(dict); dictDefinition.setField(field); dictDefinitions.add(dictDefinition); } } return dictDefinitions; } @SneakyThrows private static void doConvertDict(Object target, List<DictDefinition> dictDefinitions, Map<String, Map<String, String>> dictMapMap) { for (DictDefinition dictDefinition : dictDefinitions) { Dict dict = dictDefinition.getDict(); Field field = dictDefinition.getField(); Map<String, String> dictMap = dictMapMap.get(dict.dictName()); String dictCode = String.valueOf(FieldUtils.readField(target, field.getName(), true)); String dictField = StringUtils.isEmpty(dict.dictField()) ? field.getName() + DICT_FIELD_SUFFIX : dict.dictField(); FieldUtils.writeField(target, dictField, dictMap.get(dictCode), true); } } @Data public static class DictDefinition { private Dict dict; private Field field; } //獲取碼表 public static Map<String, Map<String, String>> getCodeTable(List<String> shopIdList){ ArrayList<String> codeTypeList = new ArrayList<>(); return codeTypeMap; } }
四、VO中使用注解確定需要字典轉(zhuǎn)換的字段
@Data @AllArgsConstructor @NoArgsConstructor @Builder public class TestVo { private Integer id; private String name; private String idCard; /** * 性別(0、未知的性別 1、男性 2、女性) */ @Dict(dictName = "sex") private String sex; //字典翻譯后的中文會(huì)賦值到該字段上面 private String sexName; }
到此這篇關(guān)于Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例的文章就介紹到這了,更多相關(guān)自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能示例
這篇文章主要介紹了Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能,較為詳細(xì)的分析了事務(wù)操作的原理、實(shí)現(xiàn)方法及java基于jdbc連接數(shù)據(jù)庫實(shí)現(xiàn)銀行事務(wù)操作的相關(guān)技巧,需要的朋友可以參考下2017-12-12Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例
本篇文章主要介紹了Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn)
這篇文章主要介紹了Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn),動(dòng)態(tài)是相對(duì)于靜態(tài)而言,何為靜態(tài),即編碼時(shí)手動(dòng)編寫代理類、委托類,而動(dòng)態(tài)呢,是不編寫具體實(shí)現(xiàn)類,等到使用時(shí),動(dòng)態(tài)創(chuàng)建一個(gè)來實(shí)現(xiàn)代理的目的,需要的朋友可以參考下2023-12-12java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08