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

java通過注解翻譯字典的實(shí)現(xiàn)示例

 更新時(shí)間:2022年04月26日 10:03:00   作者:愿君多采擷_  
本文主要介紹了java通過注解翻譯字典的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近在寫代碼時(shí)遇到一個(gè)需要將entity字段通過字典翻譯成真實(shí)值的場(chǎng)景,原來的做法是通過主表字段和字典表關(guān)聯(lián)的形式,當(dāng)一個(gè)需要大量翻譯的場(chǎng)景時(shí),大量的關(guān)聯(lián)會(huì)造成sql閱讀的不友好,所以就在想有什么可以偷懶的方法。。。

首先一個(gè)想法就是通過注解,實(shí)例化entity時(shí)就可以同步翻譯了。

先自定義注解

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DictCovert {

? ? /**
? ? ?* 字典key
? ? ?* @return
? ? ?*/
? ? String key() default "";

? ? /**
? ? ?* 是否使用redis
? ? ?* @return
? ? ?*/
? ? boolean redis() default false;

}

然后在需要轉(zhuǎn)換的entity屬性上加上注解和該屬性的key

    /**
     * 性別
     */
    @DictCovert(key = "gender",redis = true)
    private Integer gender;

有了注解,首先想到的就是通過AOP去切該注解@Pointcut("@annotation(*.*.*.DictCovert)"),捕獲到切點(diǎn)時(shí)同步處理數(shù)據(jù)就行

趕緊寫好代碼運(yùn)行,發(fā)現(xiàn)沒有如愿以償,因?yàn)槲覀冏远x的注解加在了entity上,但是entity并沒有交給spring管理,所以切點(diǎn)根本沒有奏效,草(一種植物)??!。。。。。

于是又想到了通過自定義MessageConverter的形式捕獲注解處理,然后依舊是草(一種植物)?。。。?/p>

最終最終還是找到通往羅馬的路了??

通過注解@ControllerAdvice處理全局的數(shù)據(jù),然后繼承ResponseBodyAdvice接口重寫beforeBodyWrite方法,處理數(shù)據(jù)

直接貼代碼(代碼有點(diǎn)長,個(gè)人水平有限,輕噴??)

@ControllerAdvice
@Slf4j
public class DictCovertHandler implements ResponseBodyAdvice {


? ? @Autowired
? ? private RedisTemplate redisTemplate;

? ? @Autowired
? ? private ISysDicService sysDicService;

? ? private final String DICTDIR = "DICT:";


? ? @Override
? ? public boolean supports(MethodParameter returnType, Class converterType) {
? ? ? ? //直接為true,所有返回結(jié)果都應(yīng)該檢驗(yàn)
? ? ? ? return true;
? ? }

? ? @Override
? ? public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
? ? ? ? try{
? ? ? ? ? ? Result result = (Result)body;
? ? ? ? ? ? //獲取返回值列表
? ? ? ? ? ? List<?> resList =new ArrayList<>();
? ? ? ? ? ? Object resValue = result.getData();
? ? ? ? ? ? //未分頁結(jié)果
? ? ? ? ? ? if(resValue instanceof ?ArrayList){
? ? ? ? ? ? ? ? resList =(ArrayList) resValue;
? ? ? ? ? ? }
? ? ? ? ? ? //分頁結(jié)果
? ? ? ? ? ? if(resValue instanceof Page){
? ? ? ? ? ? ? ? resList = ((Page<?>) resValue).getRecords();
? ? ? ? ? ? }
? ? ? ? ? ? //非查詢結(jié)果
? ? ? ? ? ? if(CollectionUtil.isEmpty(resList)){
? ? ? ? ? ? ? ? return ?body;
? ? ? ? ? ? }
? ? ? ? ? ? List<Map<String,Object>> resultList = new ArrayList();
? ? ? ? ? ? for (Object entity : resList) {
? ? ? ? ? ? ? ? ?//拿到bean將其轉(zhuǎn)換為map輸出
? ? ? ? ? ? ? ? ?Map<String,Object> map = BeanUtil.beanToMap(entity);
? ? ? ? ? ? ? ? //獲取字段列表
? ? ? ? ? ? ? ? Field[] fields = entity.getClass().getDeclaredFields();
? ? ? ? ? ? ? ? if(fields.length != 0){
? ? ? ? ? ? ? ? ? ? for (Field field : fields) {
? ? ? ? ? ? ? ? ? ? ? ? //存放真實(shí)值
? ? ? ? ? ? ? ? ? ? ? ? String realValue =null;
? ? ? ? ? ? ? ? ? ? ? ? //獲取注解列
? ? ? ? ? ? ? ? ? ? ? ? DictCovert dictCovert = field.getAnnotation(DictCovert.class);
? ? ? ? ? ? ? ? ? ? ? ? if(!Objects.isNull(dictCovert)){
? ? ? ? ? ? ? ? ? ? ? ? ? ? String dictKey = dictCovert.key();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //是否使用redis,default:false
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean redis = dictCovert.redis();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String fieldName = field.getName();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String methodName = "get"+dictKey.substring(0,1).toUpperCase()+dictKey.substring(1,dictKey.length());
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Method method = entity.getClass().getMethod(methodName,null);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //獲取字典原始值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Object value =method.invoke(entity,null);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(Objects.isNull(value)){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String redisKey= dictKey+"_"+value;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使用redis
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(redis){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //從redis加載字典真實(shí)信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? realValue = (String) redisTemplate.opsForValue().get(DICTDIR+redisKey);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(StrUtil.isBlank(realValue)){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SysDic sysDic = sysDicService.getById(Integer.parseInt(value.toString()));
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(!Objects.isNull(sysDic)){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? realValue = sysDic.getDictLabel();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //將結(jié)果塞入redis
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? redisTemplate.opsForValue().set(DICTDIR+redisKey,realValue);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map.put(fieldName+"String",realValue);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? resultList.add(map);
? ? ? ? ? ? }
? ? ? ? ? ? result.setData(resultList);
? ? ? ? ? ? return result;
? ? ? ? }catch (Exception e ){
? ? ? ? ? ? //翻譯失敗返回原來的值
? ? ? ? ? ? log.error("字典翻譯失敗",e);
? ? ? ? ? ? return body;
? ? ? ? }
? ? }
}

最后在返回值中會(huì)有一個(gè)帶有String的屬性,那就是翻譯后的值

到此這篇關(guān)于java通過注解翻譯字典的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java 注解翻譯字典內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況

    解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況

    這篇文章主要介紹了解決IDEA中多模塊下Mybatis逆向工程不生成相應(yīng)文件的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值

    java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值

    這篇文章主要介紹了java如何刪除以逗號(hào)隔開的字符串中某一個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot+VUE實(shí)現(xiàn)前后端分離的實(shí)戰(zhàn)記錄

    SpringBoot+VUE實(shí)現(xiàn)前后端分離的實(shí)戰(zhàn)記錄

    這篇文章主要介紹了SpringBoot+VUE實(shí)現(xiàn)前后端分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java學(xué)習(xí)常用包(類)之java.util包詳解

    Java學(xué)習(xí)常用包(類)之java.util包詳解

    這篇文章主要介紹了Java學(xué)習(xí)常用包(類)之java.util包的相關(guān)資料,Java.util包是Java標(biāo)準(zhǔn)類庫的重要組成部分,包含集合框架、日期時(shí)間類、事件模型、隨機(jī)數(shù)生成器等實(shí)用工具類,集合框架提供了多種數(shù)據(jù)結(jié)構(gòu)和算法,需要的朋友可以參考下
    2024-10-10
  • mybatis集成到spring的方式詳解

    mybatis集成到spring的方式詳解

    這篇文章主要介紹了mybatis是如何集成到spring的,將mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己創(chuàng)建SqlSessionFactory?、打開SqlSession等操作,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    spring cloud內(nèi)容匯總(各個(gè)功能模塊、啟動(dòng)、部署)的詳細(xì)過程

    Spring Cloud 是一套基于 Spring Boot 的框架集合,用于構(gòu)建分布式微服務(wù)架構(gòu),文章介紹了Spring Cloud框架及其相關(guān)工具的使用,還詳細(xì)介紹了如何配置和使用這些功能,包括配置文件、依賴管理以及實(shí)際應(yīng)用示例,感興趣的朋友一起看看吧
    2024-11-11
  • springboot配置nacos的實(shí)現(xiàn)示例

    springboot配置nacos的實(shí)現(xiàn)示例

    本文將介紹如何在Spring?Boot中配置Nacos,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • java獲取IP和IP的歸屬地的方法實(shí)踐

    java獲取IP和IP的歸屬地的方法實(shí)踐

    在Java中獲取IP地址通常指的是獲取本地機(jī)器的IP地址或者通過某種方式獲取的遠(yuǎn)程IP地址,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-05-05
  • 詳解Maven多模塊打包遇到的問題解決方法

    詳解Maven多模塊打包遇到的問題解決方法

    這篇文章主要介紹了詳解Maven多模塊打包遇到的問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

洛南县| 延庆县| 贵德县| 老河口市| 隆德县| 郯城县| 古浪县| 吕梁市| 宣武区| 尚志市| 固镇县| 化州市| 琼结县| 旅游| 错那县| 白水县| 红桥区| 道孚县| 沾化县| 宁陵县| 东阿县| 无极县| 剑河县| 开江县| 仪陇县| 宿松县| 青神县| 北辰区| 嵩明县| 建德市| 凉城县| 临潭县| 常宁市| 张北县| 南陵县| 翁源县| 呼伦贝尔市| 县级市| 吴桥县| 扬中市| 拉孜县|