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

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

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

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

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

先自定義注解

@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)"),捕獲到切點時同步處理數(shù)據(jù)就行

趕緊寫好代碼運行,發(fā)現(xiàn)沒有如愿以償,因為我們自定義的注解加在了entity上,但是entity并沒有交給spring管理,所以切點根本沒有奏效,草(一種植物)?。?。。。。。

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

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

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

直接貼代碼(代碼有點長,個人水平有限,輕噴??)

@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)該檢驗
? ? ? ? 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) {
? ? ? ? ? ? ? ? ? ? ? ? //存放真實值
? ? ? ? ? ? ? ? ? ? ? ? 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加載字典真實信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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;
? ? ? ? }
? ? }
}

最后在返回值中會有一個帶有String的屬性,那就是翻譯后的值

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

相關(guān)文章

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

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

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

    java如何刪除以逗號隔開的字符串中某一個值

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

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

    這篇文章主要介紹了SpringBoot+VUE實現(xiàn)前后端分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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ù)生成器等實用工具類,集合框架提供了多種數(shù)據(jù)結(jié)構(gòu)和算法,需要的朋友可以參考下
    2024-10-10
  • mybatis集成到spring的方式詳解

    mybatis集成到spring的方式詳解

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

    SpringCloud Feign隔離與降級詳細分析

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

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

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

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

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

    java獲取IP和IP的歸屬地的方法實踐

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

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

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

最新評論

双鸭山市| 津市市| 宜兰市| 通州市| 延津县| 江津市| 关岭| 开平市| 汝州市| 六盘水市| 华亭县| 乡城县| 宜春市| 德令哈市| 长宁县| 朝阳市| 涡阳县| 镇安县| 大安市| 唐山市| 玛多县| 河间市| 海兴县| 綦江县| 疏勒县| 延吉市| 乌兰浩特市| 南开区| 芦溪县| 连平县| 湾仔区| 海原县| 泉州市| 哈密市| 花莲县| 吉林市| 丽江市| 大同县| 元谋县| 隆安县| 仁怀市|