字典翻译@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工具 ...
随机推荐
- 8.8-9 fsck、dd
8.8 fsck:检查并修复Linux文件系统 fsck命令用于检查并修复文件系统中的错误,即针对有问题的系统或磁盘进行修复,类似的命令还有e2fsck命令.有关fsck的使用需要特别注意的是: ...
- wxPython开发之密码管理程序
不想记密码?密码全设置成一样担心安全?用别人程序担心密码泄露?看完本博客,开发一个属于自己的密码管理程序吧 我们用到的是python的wxPython界面库包 先来看下成果界面:简洁主题明确 要想开 ...
- 西门子S7200/300/400以太网通讯处理器选型分类
北京华科远创科技有限研发的远创智控转以太网模块适用于西门子S7-200/S7-300/S7-400.SMART S7-200.西门子数控840D.840DSL.合信.亿维PLC的PPI/MPI/PRO ...
- 微信小程序使用同声传译实现语音识别功能
我使用同声传译语音识别功能是为了实现微信小程序首页的语音搜索功能,如果你也是那么恭喜你,你可以ctrl+c.ctrl+v再改一改,如果你不是那么你也不要着急的走可以看完我的文章会对你有所帮助! 首先是 ...
- Yolov4性能分析(上)
Yolov4性能分析(上) 一.目录 实验测试 1) 测试介绍 2) Test 3) Train 二. 分析 1.实验测试 1. 1 实验测试方法 Yolov4训练train实验方法(Darkn ...
- adb安装 mac和Windows
一.mac安装 参考地址https://blog.csdn.net/VSRfind/article/details/79593098 1.首先安装一个软件 在用Mac进行Android开发之前,我们一 ...
- 【SQLite】教程08-SQLite可视化工具
推荐使用"SQLiteStudio" 下载地址:http://www.downza.cn/soft/208363.html 设为中文的方法: 最后重启软件即可!
- Redis源码解析之跳跃表(一)
跳跃表(skiplist) 有序集合(sorted set)是Redis中较为重要的一种数据结构,从名字上来看,我们可以知道它相比一般的集合多了一个有序.Redis的有序集合会要求我们给定一个分值(s ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(4) : 使用语言生成功能[LG: Language Generation] (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- MySQL:如何使用MyCAT实现分库分表?
分库分表介绍 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库. 数据的切分分为两种: 垂直切分:按照业务模块进行切分,将不同模块的 ...