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 needProcessFieldList = new ArrayList<>();

Map 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 needProcessFieldList, Map fieldMap) {

if(!(result instanceof Serializable)){

return;

}

List 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 getAllField(Class> clz){

List 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 needProcessFieldList,Map fieldMap){

for(String fieldName : needProcessFieldList){

setDataDesc(data, fieldMap, fieldName);

}

}

private void setDataDesc(Object data, Map 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、测试

html 字典翻译,字典翻译@Dict相关推荐

  1. 字节跳动青训营Day01 - 实战项目 - 在线翻译字典

    实战项目 - 在线翻译字典 v1,测试api响应 v2,go语言发送api请求信息的一般方式:使用结构体格式化 v3,go语言接受api请求信息的一般方式:使用结构体格式化 v4,封装函数,进行查询 ...

  2. js字符串的字典序_JavaScript通过字典进行字符串翻译转换的方法

    本文实例讲述了JavaScript通过字典进行字符串翻译转换的方法..具体分析如下: 这里实际上就是先设置一个对照的字典,然后通过翻译函数,从字典中找到相应的键值.需要在JavaScript 1.8以 ...

  3. 如何在elementUi动态表格table中翻译字典值。vue通用方案

    实现思路: 先渲染动态行,然后在行里面添加slot插槽,写需要翻译字典的判断. vue的v-for 的子组件里面 v-if . 注意v-for与v-if不要写在同一标签内. 例子: <el-ta ...

  4. python3 字典打印_Python3基础 dict items 以元组的形式打印出字典的每一个项

    Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...

  5. python 存储字典_python 字典存储

    Python学习笔记--元组.列表和字典的使用笔记 Python学习笔记--元组.列表和字典的使用笔记 最近开始学习python语言,所以在学习中做了一些记录,这次讲的是元组.列表和字典的基础操作和区 ...

  6. python之post的响应爬虫——利用python实现有道翻译在线翻译

    利用python实现有道翻译在线翻译 1 post的请求方式 1.1 post和get的区别 1.2 post特点 2.利用request.urllib实现 2.1 寻找网页源代码翻译的位置 2.2 ...

  7. 绵阳python培训_《绵》原文及翻译海绵翻译

    <绵>原文及翻译海绵翻译 查字典语文网小编给各位考 生筛选整理了 : 诗经中<绵>原文,<绵>原文翻译,诗经的来源, 希望对大家有所帮助,更多的资讯请持续关注查字典 ...

  8. Office内嵌12国语言翻译功能----翻译好助手(转)

    Office内嵌12国语言翻译功能----翻译好助手(转)[@more@] 这是Office XP/2003之后才有的超好用功能,但可能很多人都不知道,所以,每次遇到不会念或看不懂的英文.日文,往往束 ...

  9. Translatium for Mac 8.2.1 Google翻译 实时翻译 破解版下载

    像 Translatium 一样进行翻译 – 为 MacOS 提供功能最强大的 Google Translate 客户端. Translatium for Mac 8.2.1 Google翻译 实时翻 ...

最新文章

  1. 《精通Nginx》——1.2 从源代码安装Nginx
  2. 关于时间类型数据的转换
  3. iOS Xcode8的适配
  4. 【机器学习】创建自己的电影推荐系统
  5. oracle实例的概念组成,oracle体系结构的两个基本概念:数据库和实例
  6. win10系统崩溃怎么修复_系统崩溃怎么重装系统图文教程
  7. 知道半径 两点角度 怎么求坐标
  8. Django 工作流程
  9. pppoe服务器账号和密码是什么,小米路由器pppoe账号密码是什么你知道吗
  10. react的setState——读《react小书》
  11. python qq群_用Python玩转QQ群论坛
  12. 安装VS2008(转)
  13. 8个免费图片素材网,赶紧收藏起来
  14. USB有线网卡怎么用
  15. gps测试软件搜索不到星,手机搜不到星 搜星慢终极解决方法!
  16. 黄油刀 Butterknife的使用准备工作
  17. ipad/iphone内存管理三之NoAutorelease和Autorelease详细解说
  18. ObiFruid创建流体,ObiFruid学习笔记
  19. android studio开发微信界面
  20. 【蓝桥杯】——键盘是使用

热门文章

  1. 洛谷.P2705 小球
  2. 追求心仪女孩fenby
  3. USB小风扇驱动芯片FH511_NOWLED_B关闭LED灯显关闭自然风功能
  4. CSS实现九宫格布局方法
  5. MySQL之MVCC机制
  6. 【DB笔试面试759】在Oracle中,如果主库丢失归档文件,那么物理DG如何恢复?
  7. 深度学习的原理是什么?
  8. 【必知必会】手把手教你配置MySQL环境变量——图文详解
  9. vivos7和荣耀x10哪个好 vivos7和荣耀x10区别评测
  10. python 超参数_完整介绍用于Python中自动超参数调剂的贝叶斯优化