java注解的理解,java注解原理解析

  java注解的理解,java注解原理解析

  最近写代码的时候,碰到一个场景,需要通过字典把实体字段翻译成实值。最初的方法是将主表字段与字典表相关联。当一个场景需要大量的翻译时,大量的联想会造成不友好的sql读取,所以我在想有什么方法可以偷懒。

  第一个想法是注释和实例化实体,以便翻译可以同步。

  首先自定义注释

  @ target ({elementtype.field,element type . method })@ retention(retention policy . runtime)@ documented public @ interface dict cover {/* * * dictionary key * @ return */string key()default“”;/* * *是否使用redis * @ return */boolean redis()default false;}然后添加注释和要转换的实体属性的键。

  /* * * gender */@ dict cover(key= gender ,redis=true)私有整数性别;有了注释,首先想到的是剪切注释@ pointcut(@ annotation(*。*.*.dictcover))通过AOP,在捕捉到切点的时候同步数据即可。

  我赶紧把代码写好运行,发现没有得到我想要的,因为我们的自定义注释加到了entity,但是entity没有交给spring管理,所以cutting point根本不行。草(一种植物)!

  然后想到了以自定义MessageConverter的形式捕捉注释处理,然后还是草(一种植物)!

  最后,我找到了去罗马的路。

  Comment @ControllerAdvice来处理全局数据,然后继承ResponseBodyAdvice接口,重写beforeBodyWrite方法来处理数据。

  直接贴代码(代码有点长,个人水平有限,轻喷)

  @ controller advice @ SLF 4j public class diccoverthandler实现ResponseBodyAdvice { @ auto wired private redis template redis template;@ auto wired private ISysDicService sysDicService;私有最终字符串DICTDIR= DICT:@ override public boolean supports(方法参数返回类型,类converter type){//直接为true,所有返回的结果都要检查是否返回true;} @ Override public Object before body write(Object body,MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest,server httpresponse response){ try { Result Result=(Result)body;//获取返回值列表List?resList=new ArrayList();object resValue=result . get data();//if(ArrayList的resvalue实例){ RES list=(ArrayList)RES value;}//分页结果if(page的resvalue instance){ reslist=(page?)resValue)。get records();}//非查询结果if(collectiutil . isempty(reslist)){ return body;} ListMapString,Object result list=new ArrayList();

      for (Object entity : resList) {                 //拿到bean将其转换为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();                                        //将结果塞入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的属性,那就是翻译后的值

  

 

  到此这篇关于java通过注解翻译字典的实现示例的文章就介绍到这了,更多相关java 注解翻译字典内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: