字典翻译@Dict
1、编写翻译字典@Dict
/**
* 数据字典翻译注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict { public static final String SOURCE_NAME = "Id";
public static final String TARGET_NAME = "Name"; }
2、编写翻译字段注解@DictItem
@Target({ FIELD })
@Retention(RUNTIME)
public @interface DictItem {
CategoryEnum value();
}
3、编写切面实现翻译
@Aspect
@Component
@Slf4j
public class DictAspect { @Reference
private SysDictionaryDubboService sysDictionaryDubboService; @Pointcut("execution(* com.bgy.order.controller..*(..))")
public void packagePointCut(){} /**
* 返回增强:目标方法正常执行完毕时执行
*
* @param joinPoint
* @param result
*/
@AfterReturning(pointcut = "packagePointCut() && @annotation(dict)", returning = "result")
public void afterReturningMethod(JoinPoint joinPoint, Dict dict, Object result) {
processData(result);
} private void processData(Object result) {
List<String> needProcessFieldList = new ArrayList<>();
Map<String,Field> fieldMap = new HashMap<>(); if (result instanceof Page) {
for(Object object : ((Page<?>)result).getRecords()){
getProcessFieldList(object, needProcessFieldList, fieldMap);
processSingleData(object, needProcessFieldList, fieldMap);
}
} else if(result instanceof List) {
for(Object object : (List<?>) result) {
getProcessFieldList(object, needProcessFieldList, fieldMap);
processSingleData(object, needProcessFieldList, fieldMap);
}
} else if(result instanceof Map){
for(Object obj : ((Map<?,?>)result).values()){
processData(obj);
}
} else if(result instanceof Serializable){
getProcessFieldList(result, needProcessFieldList,fieldMap);
processSingleData(result, needProcessFieldList,fieldMap);
}
} private void getProcessFieldList(Object result, List<String> needProcessFieldList, Map<String,Field> fieldMap) {
if(!(result instanceof Serializable)){
return;
} List<Field> declaredFields = getAllField(result.getClass());
if (CollectionUtils.isEmpty(declaredFields)) {
return;
} for(Field field : declaredFields){
fieldMap.put(field.getName(), field);
DictItem dictItem = field.getAnnotation(DictItem.class);
if(dictItem != null){
needProcessFieldList.add(field.getName());
}
}
} private List<Field> getAllField(Class<?> clz){
List<Field> fieldList = new ArrayList<>() ;
Class<?> tempClass = clz;
while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
return fieldList;
} private void processSingleData(Object data, List<String> needProcessFieldList,Map<String,Field> fieldMap){
for(String fieldName : needProcessFieldList){
setDataDesc(data, fieldMap, fieldName);
} } private void setDataDesc(Object data, Map<String, Field> fieldMap, String fieldName) {
try {
Field field = fieldMap.get(fieldName);
Class<?> type = fieldMap.get(fieldName).getType();
if(!type.equals(Integer.class)){
return;
}
field.setAccessible(true);
Integer dictKey = (Integer)field.get(data);
DictItem dictItem = field.getAnnotation(DictItem.class);
CategoryEnum categoryEnum = dictItem.value();
if(!fieldName.endsWith(Dict.SOURCE_NAME)){
return;
}
String targetFiledName = fieldName.replace(Dict.SOURCE_NAME,Dict.TARGET_NAME);
Field findField = fieldMap.get(targetFiledName);
if (findField == null || !findField.getType().equals(String.class)) {
return ;
} findField.setAccessible(true);
String dictValue = sysDictionaryDubboService.getDictName(categoryEnum, dictKey);
findField.set(data, dictValue); } catch (Exception e) {
log.error("注入字典名称报错", e);
}
}
4、测试


字典翻译@Dict的更多相关文章
- Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict)
Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装和结构 #!/usr/bin/env pytho ...
- Git-it字典翻译
Git-it字典翻译 下面的内容翻译自git-it/dictionary 水平有限,翻译欠佳. Git准备工作 创建一个新的文件夹(目录) $ mkdir <目录名称> 切换到这个目录 ( ...
- poj 2503:Babelfish(字典树,经典题,字典翻译)
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30816 Accepted: 13283 Descr ...
- hdu 1075:What Are You Talking About(字典树,经典题,字典翻译)
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- Python+Selenium进行UI自动化测试项目中,常用的小技巧1:读取excel表,转化成字典(dict)输出
从今天开始我将会把在项目中遇到的问题,以及常用的一些技巧来分享出来,以此来促进自己的学习和提升自己:更加方便我以后的查阅. 现在要说的是:用Python来读取excel表的数据,返回字典(dict), ...
- 高级数据类型--字典(dict)
一.字典介绍 dict(字典) 是 除列表以外 Python 之中 最灵活 的数据类型.字典同样可以用来 存储多个数据,通常用于存储 描述一个 物体 的相关信息 和列表的区别: 列表 是 有序 的对象 ...
- Python基础数据类型-字典(dict)
Python基础数据类型-字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版本的哟 ...
- 字典(dict)的反转
1.今天在写12306查询余票时,想给定字典(dict)的值,从而得到字典(dict)的键,但好像字典(dict)方法中没有与此相关的方法,只能退而求其次,反转字典(dict),将原字典(dict)的 ...
- BeanUtils——JavaBean相互转换及字典翻译
JavaBean相互转换 在升级公司架构过程中,发现有大量Entity与DTO相互转换的问题,并且其中还伴随DTO中的数据字典翻译,所以特意写个工具类,主要利用spring提供的BeanUtils工具 ...
随机推荐
- Linux中级之netfilter防火墙(iptables)
一.什么是防火墙? 防火墙其实就是一个隔离工具:工作于主机或者网络的边缘 对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配检测 对于能够被规则所匹配的报文做出相应处理的组件(这个组件可以是硬 ...
- UCOS明白解析
UCOSII 是一个可以基于 ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS).为了提供最 ...
- harobor私有docker镜像仓库
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Distribu ...
- 如何使用 IoC
创建Maven工程,pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project x ...
- Step By Step(Lua元表与元方法)
Step By Step(Lua元表与元方法) Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表 ...
- CVPR2020论文介绍: 3D 目标检测高效算法
CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...
- AIoT开放平台及应用
AIoT开放平台及应用 阿里AIoT开放平台,是阿里云IoT面向开发者的能力接入渠道,开发者可以在这里完成能力的申请.开通.部署.配置和集成开发等一些列工作.这些能力并不的独立交付,而是通过关联到行业 ...
- 蓝牙mesh网络技术的亮点
蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...
- sql优化_隐式-显示转换
======== 测试表1信息 =======SQL> select count(*) from tb_test; COUNT(*)---------- 3000000 SQL&g ...
- Centos Yum 安装 Mysql 5.7
Centos 6 / 7 官方源安装Mysql 5.7 1 检查当前系统是否有旧版本 # rpm -qa | grep mysqlmysql-libs-5.1.71-1.el6.x86_64 # r ...