Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段
前言
项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法,所以推荐使用自定义注解、Json序列化器,Spring的缓存功能实现自动转换字典类型字段。以下实现SpringBoot版本为2.6.13。
一、自定义字典注解
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.common.utils.DictSerializer;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/**定义一个自定义注解,用于标识需要进行字典自动翻译的字段。**/
@Target({ElementType.FIELD}) //表示它只能应用在类的字段上。
@Retention(RetentionPolicy.RUNTIME) //确保注解在运行时可用。
@JacksonAnnotationsInside
@JsonSerialize(using = DictSerializer.class)//指定使用DictSerializer来处理被注解字段的序列化,不加@Dict注解的字段不会被DictSerializer处理。
public @interface Dict {/*** 字典代码*/String type() default "";/*** 字段后缀*/String suffix() default "Name";
}
二、自定义Json序列化器
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.SneakyThrows;
import java.io.IOException;
import java.util.Objects;/**@Dict注解中引入了JsonSerializer,加了@Dict注解的字段的序列化会被DictSerializer处理。不能在DictSerializer 类上加@JsonComponent注解或者自定义配置类 JacksonConfig来注册Json序列化器,使用注解或配置类注册序列化器会使其全局生效,任何字段的序列化会被DictSerializer处理。**/
public class DictSerializer extends JsonSerializer<Object> {@SneakyThrows@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {// 写入原字段的值gen.writeObject(value);if (Objects.nonNull(value)) {// 获取数据字典项服务实例// 不使用全局变量和在构造函数中获取Bean,延迟加载Bean,避免构造函数初始化空指针问题DictService dictService = SpringContextHolder.getBean(SysDictItemService.class);// 序列化字段名称String fieldName = gen.getOutputContext().getCurrentName();// 字典项注解对象Dict dictAnno = gen.getCurrentValue().getClass().getDeclaredField(fieldName).getAnnotation(Dict.class);String dictItemName = dictService.getDictItemName(dictAnno.type(), value);// 写入新字段名称gen.writeFieldName(fieldName + dictAnno.suffix());// 写入新字段的值gen.writeString(dictItemName);}}
}
三、Spring上下文工具类
@Component
public class SpringContextHolder implements ApplicationContextAware {private static ApplicationContext context;public static <T> T getBean(Class<T> clazz) {return context.getBean(clazz);}@Overridepublic void setApplicationContext(ApplicationContext ctx) {context = ctx;}
}
三、字典服务层(含缓存)
1.SpringBoot启动类上加@EnableCaching注解开启缓存功能
2.根据字典代码和字典项代码查询字典项名称
/*** @Cacheable为SpringBoot自带的缓存注解,使用字典代码+字典项代码作为缓存的key,使用该注解会自动 * 缓存getDictItemName方法的返回值。*/@Cacheable(value = "dictCache", key = "#dictCode+':'+#code")@Overridepublic String getDictItemName(String dictCode, Object code) {List<SysDictItem> itemList = ......;String value = null;if(CollectionUtils.isNotEmpty(itemList)){value = itemList.get(0).getItemName();}return Optional.ofNullable(value).orElse(code.toString());}
3.新增或修改字典项
/*** @CachePut注解是SpringBoot自带的缓存注解,使用该注解在更新字典时会自动更新字典缓存,注意此处 * 的key要与getDictItemName方法@Cacheable注解中的key一致,saveOrUpdateDictItem方法必须要返回要* 缓存的内容,即字典项名称。*/@CachePut(value = "dictCache", key = "#dictItem.dictCode+':'+#dictItem.itemCode")@Overridepublic String saveOrUpdateDictItem(SysDictItem dictItem) {String itemName = null;int con;if(StringUtils.isBlank(dictItem.getItemId())){//新增con = baseMapper.insert(dictItem);} else {//修改con = baseMapper.updateById(dictItem);}if(con > 0){itemName = dictItem.getItemName();}return itemName;}
参考资料:
1.百度DeepSeek-R1满血版搜索结果
2.csdn收藏(Springboot)中的https://blog.csdn.net/hangbingbihai/article/details/145452376?spm=1001.2014.3001.5506
https://blog.csdn.net/demo_yo/article/details/129157902?spm=1001.2014.3001.5506
相关文章:
Spring Boot2.0之十 使用自定义注解、Json序列化器实现自动转换字典类型字段
前言 项目中经常需要后端将字典类型字段值的中文名称返回给前端。通过sql中关联字典表或者自定义函数不仅影响性能还不能使用mybatisplus自带的查询方法,所以推荐使用自定义注解、Json序列化器,Spring的缓存功能实现自动转换字典类型字段。以下实现Spri…...
从电子管到量子计算:计算机技术的未来趋势
计算机发展的历史 自古以来人类就在不断地发明和改进计算工具,从结绳计数到算盘,计算尺,手摇计算机,直到1946年第一台电子计算机诞生,虽然电子计算机至今虽然只有短短的半个多世纪,但取得了惊人的发展吗,已经经历了五代的变革。计算机的发展和电子技术的发展密切相关,…...
将CUBE或3DL LUT转换为PNG图像
概述 在大部分情况下,LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT,通常是图像格式的 LUT 文件。下面,我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换(不是8x8网络)&am…...
python文件的基本操作,文件读写
1.文件 1.1文件就是存储在某种长期存储设备上的一段数据 1.2文件操作 打开文件-->读写文件-->关闭文件 注意:可以只打开和关闭文件不进行任何操作 1.3文件对象的方法 1.open():创建一个file对象,默认以只读模式打开 2.read(n):n表示从文件中…...
华为认证考试证书下载步骤(纸质+电子版)
华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…...
正式页面开发-登录注册页面
整体路由设计: 登录和注册的切换是切换组件或者是切换内容(v-if和 v-else),因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页,有三个大模块:文章分类&…...
nss刷题5(misc)
[HUBUCTF 2022 新生赛]最简单的misc 打开后是一张图片,没有其他东西,分离不出来,看看lsb,红绿蓝都是0,看到头是png,重新保存为png,得到一张二维码 扫码得到flag [羊城杯 2021]签到题 是个动图…...
深入Linux序列:进程的终止与等待
在之前的学习中,我们知道我们的进程在运行结束的时候,那么它并不会立即进入死亡状态,而是先进入僵尸状态,维持僵尸状态一段时间,那么此时在僵尸状态中的进程,那么它的内核数据已经移出内存被清理了…...
蓝桥杯之日期问题2
文章目录 需求11.1 代码 2.需求22.1代码 需求1 2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期…...
【STL】7.STL常用算法(1)
STL常用算法(1) 前言简介一.遍历算法1.for_each2.transform 二.查找算法1.find2.find_if3.adjacent_find4.binary_search5.count6.cout_if 三.排序算法1.sort2.random_shuffle3.merge4.reverse 总结 前言 stl系列主要讲述有关stl的文章,使用S…...
uniapp 本地数据库多端适配实例(根据运行环境自动选择适配器)
项目有个需求,需要生成app和小程序,app支持离线数据库,如果当前没有网络提醒用户开启离线模式,所以就随便搞了下,具体的思路就是: 一个接口和多个实现类(类似后端的模板设计模式)&am…...
百度觉醒,李彦宏渴望光荣
文 | 大力财经 作者 | 魏力 2025年刚刚开年,被一家名为DeepSeek的初创公司强势改写。在量化交易出身的创始人梁文锋的带领下,这支团队以不到ChatGPT 6%的训练成本,成功推出了性能可与OpenAI媲美的开源大模型。 此成果一经问世,…...
【算法工程】大模型局限性新发现之解决能连github但无法clone项目的问题
最近,linux服务器遇到一个奇怪的问题,能ping通github,但是无法clone git项目,尝试了各种大模型,都提到代理啥的问题,发现没有一个能解决问题。 后来尝试设置 http.sslVerify 为 false,才解决问题…...
SOME/IP-SD -- 协议英文原文讲解3
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.4…...
软件测试八股文,软件测试常见面试合集【附答案】
PS:加上参考答案有几十万字,答案就没有全部放上来了,高清打印版本超过400多页,评论区留言直接获取 1、你的测试职业发展是什么? 2、你认为测试人员需要具备哪些素质 3、你为什么能够做测试这一行 4、测试的目的是什么? 5、…...
数据结构秘籍(一)线性数据结构
1.数组 数组(Array)是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)计算出该元素对应的存储地址。 数组的特…...
TFChat:腾讯大模型知识引擎(DeepSeek R1)+飞书机器人实现AI智能助手
效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1,项目为sanic和redis实现,利用httpx异步处理流式响应,同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…...
使用消息队列怎样防止消息重复?
大家好,我是君哥。 使用消息队列时,我们经常会遇到一个可能对业务产生影响的问题,消息重复。在订单、扣款、对账等对幂等有要求的场景,消息重复的问题必须解决。 那怎样应对重复消息呢?今天来聊一聊这个话题。 1.三…...
MySQL安装多版本与版本切换
起因 今天在将一个项目部署到本地,想着是先找到一个功能差不多的开源项目,再在这基础之上进行改动,找到的这个项目使用的MySQL版本是MySQL5.7,应该是比较古早的项目了,但是我现在装的是8.4版本的,所以涉及…...
Docker02 - 深入理解Docker
深入理解Docker 文章目录 深入理解Docker一:Docker镜像原理1:镜像加载原理1.1:unionFS1.2:加载原理 2:分层理解 二:容器数据卷详解1:什么是容器数据卷2:使用数据卷3:具名…...
BAAI/bge-m3实战:快速构建个人知识库与智能问答助手
BAAI/bge-m3实战:快速构建个人知识库与智能问答助手 1. 项目概述与核心价值 BAAI/bge-m3是北京智源研究院推出的开源语义嵌入模型,在MTEB(Massive Text Embedding Benchmark)榜单上表现优异。这个多语言通用嵌入模型能够将文本转…...
深度拆解全连接神经网络:从结构到计算的核心原理
🔍 深度拆解全连接神经网络:从结构到计算的核心原理一、全连接神经网络:结构美学与连接规则 ✨1. 网络三层核心结构2. 神经元连接黄金规则3. 网络结构可视化(Mermaid)二、数据输入规范:只认二维矩阵的「严格…...
3步打造你的云端Windows 12:无需安装,浏览器直接体验
3步打造你的云端Windows 12:无需安装,浏览器直接体验 【免费下载链接】win12 Windows 12 网页版,在线体验 点击下面的链接在线体验 项目地址: https://gitcode.com/gh_mirrors/wi/win12 想要在浏览器中体验最新的Windows系统界面吗&am…...
从零到一:ArduPilot无人船(车)核心参数实战调优指南
1. 从零认识ArduPilot参数体系 第一次打开Mission Planner地面站时,看到密密麻麻的参数列表确实容易懵。我刚开始玩ArduPilot无人船时,光是找某个参数就得花半小时。后来发现这些参数其实像乐高积木——看似杂乱,但按功能模块拆解后就清晰了…...
临床医生也能懂的蛋白质组学:疾病标志物发现全流程解析
临床医生也能懂的蛋白质组学:疾病标志物发现全流程解析 在肝癌诊疗中,我们常遇到这样的困境:当超声发现肝脏占位时,患者往往已进入中晚期。而甲胎蛋白(AFP)作为传统标志物,其敏感性和特异性仅约…...
mysql数据库性能基准测试工具推荐_使用sysbench进行压力测试
sysbench 是 MySQL 压测的事实工业标准,因其 Lua 脚本灵活性、指标可对标 SLO 且被主流云厂商广泛采用;必须源码编译以适配 MySQL 8.0 认证机制;prepare 卡住多因权限、网络或 max_allowed_packet 不足;不同 Lua 脚本事务结构差异…...
揭秘DXVK:Vulkan驱动的Direct3D翻译层革命
揭秘DXVK:Vulkan驱动的Direct3D翻译层革命 【免费下载链接】dxvk Vulkan-based implementation of D3D8, 9, 10 and 11 for Linux / Wine 项目地址: https://gitcode.com/gh_mirrors/dx/dxvk DXVK(Direct3D to Vulkan)是一款革命性的开…...
用Stata复现经典论文:Card Krueger (1994)最低工资DID分析全流程(含数据与代码)
用Stata复现经典论文:Card & Krueger (1994)最低工资DID分析全流程 1994年,经济学家David Card和Alan Krueger发表了一篇颠覆传统经济学认知的经典论文,他们通过对比新泽西州和宾夕法尼亚州快餐店就业数据,发现最低工资上涨并…...
5大核心功能深度解析:Jasminum如何重塑你的中文文献管理工作流
5大核心功能深度解析:Jasminum如何重塑你的中文文献管理工作流 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 如果你…...
3步掌握Pyfa:EVE Online舰船配置的免费开源解决方案
3步掌握Pyfa:EVE Online舰船配置的免费开源解决方案 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa 你是否曾经在EVE Online游戏中花费数百万ISK测试舰船配…...
