最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用自定義注解+反射實現(xiàn)字典轉換代碼實例

 更新時間:2023年09月23日 08:28:42   作者:也曾眼眸有光  
這篇文章主要介紹了Java使用自定義注解+反射實現(xiàn)字典轉換代碼實例,注解是一種能被添加到java代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下

一、自定義注解類

import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dict {
    /**
     * 字典編碼
     */
    String dictName();
    /**
     * 實體類內對應的中文字段名,默認為“當前字段+Text”
     * <p>
     * 例如當前字段為“type”,則對應中文字段默認為“typeText”
     */
    String dictField() default "";
}

二、AOP切面類

也可不使用切面,定義工具類進行處理

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("查詢結果字典轉換失敗", e);
        }
    }
}

三、字典轉換工具類

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  轉碼工具類  需要在DTO中使用注解進行轉碼
 * @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 目標實體類
     * @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中使用注解確定需要字典轉換的字段

@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;
	//字典翻譯后的中文會賦值到該字段上面
    private String sexName;
}

到此這篇關于Java使用自定義注解+反射實現(xiàn)字典轉換代碼實例的文章就介紹到這了,更多相關自定義注解+反射實現(xiàn)字典轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)SHA1加密代碼實例

    Java實現(xiàn)SHA1加密代碼實例

    這篇文章給大家分享了Java實現(xiàn)SHA1加密的相關實例代碼,有興趣的朋友可以測試參考下。
    2018-07-07
  • Spring如何替換掉默認common-logging.jar

    Spring如何替換掉默認common-logging.jar

    這篇文章主要介紹了Spring如何替換掉默認common-logging.jar,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • mybatis-plus:xml拼接sql方式

    mybatis-plus:xml拼接sql方式

    這篇文章主要介紹了mybatis-plus:xml拼接sql方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • MyBatis使用Map與模糊查詢的方法示例

    MyBatis使用Map與模糊查詢的方法示例

    這篇文章主要給大家介紹了關于MyBatis使用Map與模糊查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Java中的@Async異步功能詳解

    Java中的@Async異步功能詳解

    這篇文章主要介紹了Java中的@Async異步功能詳解,@Async注解,可以實現(xiàn)異步處理的功能,它可以有返回值,或者直接在新線程時并行執(zhí)行一個任務,對于異步來說,它的執(zhí)行是有條件的,你需要把異步代碼塊放在單獨的類里,需要的朋友可以參考下
    2023-11-11
  • Java?Web中Ajax技術使用方法介紹

    Java?Web中Ajax技術使用方法介紹

    ajax技術是使頁面能局部刷新的一種技術,下面這篇文章主要給大家介紹了關于JavaWeb之Ajax的基本使用與實戰(zhàn)案例的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • spring boot的攔截器簡單使用示例代碼

    spring boot的攔截器簡單使用示例代碼

    這篇文章主要介紹了spring boot的攔截器簡單使用實例代碼,需要的的朋友參考下吧
    2017-04-04
  • 基于Scala和Java方法的相互調用

    基于Scala和Java方法的相互調用

    這篇文章主要介紹了Scala和Java方法的相互調用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • @DateTimeFormat和@JsonFormat注解的用法及說明

    @DateTimeFormat和@JsonFormat注解的用法及說明

    通過在實體類屬性上使用`@DateTimeFormat`和`@JsonFormat`注解,可以實現(xiàn)日期時間格式的入?yún)⒑统鰠⒏袷交?確保前端傳入的參數(shù)能夠正確解析,并且后端返回的日期時間格式符合需求
    2025-11-11
  • myeclipse中使用maven前常見錯誤及解決辦法

    myeclipse中使用maven前常見錯誤及解決辦法

    這篇文章主要介紹了myeclipse中使用maven前常見錯誤及解決辦法 的相關資料,需要的朋友可以參考下
    2016-05-05

最新評論

仪征市| 东阿县| 油尖旺区| 太仓市| 清河县| 宁强县| 康平县| 彭州市| 新邵县| 温宿县| 临江市| 洛浦县| 金堂县| 工布江达县| 米林县| 汕尾市| 嘉荫县| 东阿县| 临高县| 台州市| 汕尾市| 崇州市| 南投县| 巩义市| 松滋市| 安康市| 塔河县| 东乌珠穆沁旗| 石林| 康保县| 永州市| 株洲市| 文山县| 巴林右旗| 慈溪市| 塔河县| 大同市| 文安县| 中西区| 霸州市| 达孜县|