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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。