【RuoYi-Vue-Plus】学习笔记 47 - 翻译功能 Translation 源码分析

news/2024/12/13 2:26:15/

文章目录

    • 前言
    • 参考目录
    • 功能代码实现及测试
      • 目录结构说明
      • 测试类
    • 功能调用流程分析
      • 1、翻译配置初始化 `TranslationConfig#init`
      • 2、翻译功能的实现
      • 2.1、创建自定义上下文序列化器 `TranslationHandler#createContextual`
      • 2.2、设置空值序列化器 `TranslationBeanSerializerModifier#changeProperties`
      • 2.3、属性值的翻译实现 `TranslationHandler#serialize`

前言

朋友们新年好呀,好久没有更新专栏了,有一部分原因是前段时间比较懒(诶不是,是工作比较忙),还有一部分原因是最近投入到了 框架 5.X 版本 的开发当中,目前在开发多租户相关的功能。多说两句,5.X 是基于 Spring Boot 3.XJDK 17,因此不再向下兼容了,是一次大升级,不过功能还不完善,所以目前只能学习使用,投入生产还需要一段时间。

回到这篇文章,想说说 狮子大佬 开发的一个新的功能:翻译功能。

之所以会有这个功能,起因是 5.X 改变了字段存储的类型:表结构创建人和修改人字段使用ID存储,但是前端展示还是维持原本的样子,因此需要把 id 转换成原本的内容再返回。框架采用的是和脱敏功能类似的方式,通过自定义注解 + 自定义序列化器来实现,具体的过程下面细说。

参考目录

  • 翻译功能
    主要是关于该功能的使用说明以及扩展说明。
  • 【RuoYi-Vue-Plus】学习笔记 28 - 数据脱敏 Json 序列化工具 SensitiveJsonSerializer
    关于序列化过程的解析可以参考以前的这篇文章,本文不再重复这一部分,主要说明翻译功能的实现以及调用流程。

功能代码实现及测试

目录结构说明

在这里插入图片描述

说明功能
Translation通用翻译注解标注需要翻译的字段,用于实体类字段上
TranslationType翻译类型注解标注翻译字段的实现类型,用于实现类上标注
TransConstant翻译常量TranslationType 类型常量
TranslationConfig翻译模块配置类配置初始化,设置序列化修改器
TranslationBeanSerializerModifierBean 序列化修改器解决序列化过程中 Null 被单独处理问题
TranslationHandler翻译处理器对标注了 @Translation 注解的字段进行翻译
TranslationInterface翻译接口提供翻译接口用于自定义翻译扩展
*TranslationImpl翻译实现类根据 TranslationType 提供不同的翻译数据

测试类

系统目前内置了几种常用的翻译功能,包括:用户 id 转账号部门 id 转名称字典类型转标签ossId 转 url。本文以用户id转账号为例进行说明。

com.ruoyi.demo.domain.vo.TestDemoVo
在这里插入图片描述

如上图,只需要在实体类字段上标注好注解即可,mapper是指定取相应字段的值进行翻译。

调用列表接口 /demo/demo/list,查看页面返回值。
在这里插入图片描述

功能调用流程分析

1、翻译配置初始化 TranslationConfig#init

初始化方法流程如下:
在这里插入图片描述

系统启动时,会自动扫描所有类,因此根据所有 TranslationInterface 实现类的长度创建一个map。
在这里插入图片描述

遍历所有实现类并按照 key 为翻译类型(实现类上标注的 type),value 为翻译实现的结构存到 map。
在这里插入图片描述

在这里插入图片描述

保存到 TRANSLATION_MAPPER
在这里插入图片描述

在这里插入图片描述

2、翻译功能的实现

注意这里只分析系统自定义的部分,关于完整的序列化流程这里不再展开,如果有兴趣的朋友可以参考之前的笔记 28(在上面参考目录有列出)。

2.1、创建自定义上下文序列化器 TranslationHandler#createContextual

在第一次进行 Bean 属性序列化操作的时候,会先创建上下文序列化器,然后会缓存到本地,便于下次的序列化操作。
在这里插入图片描述

2.2、设置空值序列化器 TranslationBeanSerializerModifier#changeProperties

当 Bean 属性值为 null,会有专门的空值序列化操作,这里设置了翻译功能的空值序列化器还是 TranslationHandler。如果不设置,则会走默认的序列化器。
在这里插入图片描述

查看设置了序列化器的字段:
在这里插入图片描述

序列化器以及空值序列化器:
在这里插入图片描述

2.3、属性值的翻译实现 TranslationHandler#serialize

上面说到需要设置空值序列化器,当需要序列化该空字段的时候,会调用以下方法:

BeanPropertyWriter#serializeAsField
在这里插入图片描述

TranslationHandler#serialize
在这里插入图片描述

首先获取实现类,通过反射获取注解标注的映射的字段值:
在这里插入图片描述

在这里插入图片描述

然后调用实现类的方法进行翻译:

UserNameTranslationImpl#translation
在这里插入图片描述

最后返回结果并由生成器写出最终结果到属性中:
在这里插入图片描述

至此便完成了一个属性值的翻译功能。其他几种翻译实现过程是一样的,只是实现类不同,如果有需要也可以根据自身实际情况进行定制化。

(完)


http://www.ppmy.cn/news/22713.html

相关文章

C#里使用UdpClient和线程来创建UDP网络通讯

C#里使用UdpClient和线程来创建UDP网络通讯 在开发的过程中,时不时就需要使用到UDP通讯。 比如与仪器进行通讯,获取仪器的数据。 又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。 作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯, 才可以随着应用范围的改…

互融云汽车融资租赁系统-汽车金融软件开发

汽车融资租赁作为汽车金融中典型的业务模式,是一种依托现金分期付款的方式,在此基础之上引入出租服务中所有权和使用权分离的特性,租赁结束后将所有权转移给承租人的现代营销方式。即在租赁期内,用户以分期支付租金的方式获得车辆…

开源工具系列3:Prowler

在处理云安全的问题时,一种非常重要的思路就是检测和持续监控云上资源的安全情况,通过专业工具的支持,可以让云安全管理在问题发生前发现云环境中的潜在威胁,进而去采取有效的处理措施。 Prowler 是什么 Prowler 是一个命令行工具…

Docker进阶 - 2. Dockerfile 常用保留字简介

目录 1. FROM 2. MAINTAINER 3. RUN 4. EXPOSE 5. WORKDIR 6. USER 7. ENV 8. VOLUME 9. COPY 10. ADD 11. CMD 12. ENTRYPOINT 13. CMD 和 RUN 命令的区别 本篇文章的讲解截屏示例基于tomcat的Dockerfile:tomcat/9.0/jdk8/openjdk/Dockerfile 1. FR…

PB-02-kit开发板的固件下载和nRF Connect APP的蓝牙透传

PB-02-kit开发板的固件下载和nRF Connect APP的蓝牙透传PB-02-kit开发板固件的下载nRF Connect APP蓝牙透传APP发送消息APP接收消息更改MTU值PB-02-kit开发板 PB-02 是安信可基于天猫精灵TG7100B芯片设计的一款蓝牙模组,PB-02-Kit 开发板是针对 PB-02 模组而设计的一…

C进阶_动态版通讯录_增删查改

真正的程序员不接受团队开发的理念,除非他自己是头头。 你的一个程序有时正常有时不正常,而你已经完全遵循编程的规则,为什么?事实上我认为相信只要遵循别人所说就能得到想当然的结果的人其实是个傻瓜。 疯狂的程序员决不是靠狂…

【C++学习】基础语法(二)

在C语言中,为了增强代码的复用性、提高性能提出了宏,但宏也存在着调试不方便、没有类型的安全检查、代码可读性差及可维护性差的缺陷。在C中,引入内联函数实现宏定义的功能(宏函数),并针对宏定义的缺陷进行…

网络编程-TCP流套接字

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1.Java 流套接字编程模型 2.SeverSocket API 3.So…