springboot自定义Json序列化返回,实现自动转换字典值
自定义序列化
原理
当你使用Spring Boot的Spring Data或者Spring MVC等组件来处理JSON序列化时,Spring框架会在需要将Java对象转换为JSON字符串时调用JsonSerializer。这通常发生在控制器方法返回JSON响应时,或者在将对象保存到数据库等操作中。
// 注册到环境中
@Configuration
public class CustomJsonConverterConfig {@Beanpublic DictJsonSerializer serializer(ObjectMapper objectMapper) {final DictJsonSerializer dictJsonSerializer = new DictJsonSerializer();/*final BigDecimalSerializer bigDecimalSerializer = new BigDecimalSerializer();final DoubleSerializer doubleSerializer = new DoubleSerializer();*/SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(BaseDictVo.class, dictJsonSerializer);simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
// simpleModule.addSerializer(BigDecimal.class, bigDecimalSerializer);
// simpleModule.addSerializer(Double.class, doubleSerializer);objectMapper.registerModule(simpleModule);return dictJsonSerializer;}
}
跟基础平台不同,返回的是序列化类,而不是objectMapper
编写序列化实现类
(注意:只有当返回对象实现了BaseDictVo才会生效,避免对所有代码进行过滤,导致性能损耗)
public class DictJsonSerializer extends JsonSerializer<BaseDictVo> {/*** 自定义字典序列化** @param source 字段值* @param generator Json 生成器* @param provider Json 提供者* @throws IOException*/@Overridepublic void serialize(BaseDictVo source, JsonGenerator generator, SerializerProvider provider) throws IOException {// 写入JSON开头对象 {generator.writeStartObject();for (Field field : source.getClass().getDeclaredFields()) {final Object fieldValue = ReflectUtil.getFieldValue(source, field);final TransDict transDict = field.getDeclaredAnnotation(TransDict.class);if (Objects.isNull(fieldValue) || Objects.isNull(transDict)) {if (Objects.nonNull(fieldValue)) {generator.writeObjectField(field.getName(), fieldValue);}continue;}// 字典编码final String dictCode = transDict.code();// 转换的目标字段final String targetFiledName = transDict.alias();if (StringUtils.isBlank(dictCode)) {generator.writeObjectField(field.getName(), fieldValue);continue;}// 字段转换final List<String> strings = Arrays.asList(StringUtils.split(fieldValue.toString(), ","));StringBuilder dictValues = new StringBuilder();final Iterator<String> iterator = strings.iterator();while (iterator.hasNext()) {String code = iterator.next();String val = DictUtil.convertDict(dictCode, code);if (StringUtils.isBlank(code) || StringUtils.isBlank(val)) {continue;}dictValues.append(val);if (iterator.hasNext()) {dictValues.append(",");}}// 目标字段存在则设置目标字段值,否则设置当前字段值if (StringUtils.isNotBlank(targetFiledName)) {generator.writeObjectField(field.getName(), fieldValue);generator.writeObjectField(targetFiledName, dictValues.toString());} else {generator.writeObjectField(field.getName(), dictValues.toString());}}// 写入JSON结尾对象 }generator.writeEndObject();}
}
定义注解
用以标记字段,获取字典的编码,以及指定的目标替换字段
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TransDict {String code() default "";String alias() default "";
}
定义基类
用以标记生效的类
public interface BaseDictVo {
}
使用类
使用注解示例
@Data
@ApiModel("反馈项vo")
public class CmFeedbackConfigVo implements BaseDictVo {@ApiModelProperty(value = "业务域编码(直饮水-DRINK、SUPPLY-供水)")@TransDict(code = "IAM_DOMAIN", alias = "businessDomainCodeValue")private String businessDomainCode;@ApiModelProperty(value = "业务域编码(直饮水-DRINK、SUPPLY-供水)")private String businessDomainCodeValue;
}
效果
每次前端发起请求时,因为RestController作用,会在返回时把结果序列化为Json,即触发自定义序列化类
相关文章:
springboot自定义Json序列化返回,实现自动转换字典值
自定义序列化 原理 当你使用Spring Boot的Spring Data或者Spring MVC等组件来处理JSON序列化时,Spring框架会在需要将Java对象转换为JSON字符串时调用JsonSerializer。这通常发生在控制器方法返回JSON响应时,或者在将对象保存到数据库等操作中。 // 注册…...
Lostash同步Mysql数据到ElasticSearch(二)logstash脚本配置和常见坑点
1. logstash脚本编写(采用单文件对应单表实例) 新建脚本文件夹 cd /usr/local/logstash mkdir sql & cd sql vim 表名称.conf #如: znyw_data_gkb_logstash.conf 建立文件夹,保存资源文件更新Id mkdir -p /data/logstash/data/last_r…...
兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场
项目说明 兔兔答题是用户端基于uniapp开发支持多端适配,管理端端采用TypeScriptVue3.jselement-plus,后端采用THinkPHP6PHP8Golang开发的一款在线答题应用程序。 问题反馈 线上预览地址 相关问题可以通过下方的二维码,联系到我。了解更多 …...
76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)
就是 ssm 那套,在xml 上面写sql ★ 基于SqlSession来实现DAO组件的方式 - MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、并将它注入其他组件(如DAO组件)- DAO组件可直接…...
【ROS】RViz、Gazebo和Navigation的关系
1、RViz RViz(Robot Visualization,机器人可视化)是一个用于可视化机器人系统的开源工具,用于显示和调试机器人的传感器数据、状态信息和运动规划等。它是ROS(Robot Operating System)的一部分,是ROS中最常用的可视化工具之一。 RViz:“我们不生产数据只做数据的搬运…...
智能井盖:提升城市井盖安全管理效率
窨井盖作为城市基础设施的重要组成部分,其安全管理与城市的有序运行和群众的生产生活安全息息相关,体现城市管理和社会治理水平。当前,一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容,推动窨井盖等“城市部件”配套建…...
JavaWeb开发-06-SpringBootWeb-MySQL
一.MySQL概述 1.安装、配置 官网下载地址:https://dev.mysql.com/downloads/mysql/ 2.数据模型 3.SQL简介 二.数据库设计-DDL 1.数据库 官网:http:// https://www.jetbrains.com/zh-cn/datagrip/ 2.表(创建、查询、修改、删除) #…...
十六、垃圾回收相关概念
目录 一、System.gc()的理解二、内存溢出和内存泄漏2、内存泄漏 三、Stop the World1、什么是 stop the word ? 四、垃圾回收的并行和并发1、并发和并发2、垃圾回收的并行和并发 五、安全点与安全区域1、什么是安全点?2、安全区域 六、强引用(不可回收&…...
hive、spark、presto 中的增强聚合-grouping sets、rollup、cube
目录 1、什么是增强聚合和多维分析函数? 2、grouping sets - 指定维度组合 3、with rollup - 上卷维度组合 4、with cube - 全维度组合 5、Grouping__ID、grouping() 的使用场景 6、使用 增强聚合 会不会对查询性能有提升呢? 7、对grouping sets、…...
elasticsearch bulk 批量操作
1:bulk 是 elasticsearch 提供的一种批量增删改的操作API bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 ,只能放在同一行,同时, 相邻的JSON串之间必须要有换行 (Linux下是\n;Window下是\r\n&#…...
力扣11、 盛最多水的容器
方法一:双指针 考察: 贪心、数组、双指针 说明 本题是一道经典的面试题,最优的做法是使用「双指针」。如果读者第一次看到这题,不一定能想出双指针的做法。 复杂度分析 时间复杂度:O(N),双指针总计最多…...
IIC协议详解
目录 1.IIC协议概述 2.IIC总线传输 3.IIC-51单片机应用 1.起始信号 2.终止信号 3.应答信号 4.数据发送 4.IIC-32单片机应用 用到的库函数: 1.IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线)是由PHILIPS公司在80年代开发的两线式串行总线&…...
element ui-表头自定义提示框
版本 “element-ui”: “^2.15.5”,需求:鼠标悬浮到该列表头,显示提示框代码 <el-table:data"xxxx"><el-table-column label"序号" width"40" type"index" /><el-table-columnv-for"(ite…...
Python 图形化界面基础篇:创建顶部菜单
Python 图形化界面基础篇:创建顶部菜单 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建顶部菜单栏步骤4:处理菜单项的点击事件步骤5:启动 Tkinter 主事件循环 完整示例代码…...
java实现十大排序算法
文章目录 冒泡排序选择排序插入排序希尔排序归并排序快速排序堆排序桶排序基数排序计数排序验证各个排序的时间复杂度和空间复杂度 冒泡排序 冒泡排序(Bubble Sort)是一种简单的比较排序算法,它的基本思想是重复地交换相邻的两个元素&#x…...
Linux日志管理-logrotate(crontab定时任务、Ceph日志转储)
文章目录 一、logrotate概述二、logrotate基本用法三、logrotate运行机制logrotate参数 四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢?Linux文件操作机制方案一方案二 五、logrotate实战--Ceph日志转储参考 一、logrotate概述 logrotate是一个用于…...
用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取
背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以,想通过php异步协程,发起爬取url请求控制python爬虫脚本,达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…...
VUE3写后台管理(3)
VUE3写后台管理(3) 1.环境1.node2.vite3.Element-plus4.vue-router5.element icon6.less7.vuex8.vue-demi9.mockjs10.axios11.echarts 2.首页1.布局Main2.头部导航栏CommonHeader3.左侧菜单栏CommonLeft4.首页Home1.从后端获取数据显示到前端table的三种…...
机器学习笔记之最优化理论与算法(十二)无约束优化问题——共轭梯度法
机器学习笔记之最优化理论与方法——共轭梯度法 引言回顾:共轭方向法的重要特征线性共轭梯度法共轭方向公式的证明过程 关于线搜索公式中参数的化简关于线搜索公式中步长部分的化简关于线搜索公式中共轭方向系数的化简参数化简的目的 非线性共轭梯度法(FR,PRP方法)关…...
JVM中的java同步互斥工具应用演示及设计分析
1.火车站售票系统仿真 某火车站目前正在出售火车票,共有50张票,而它有3个售票窗口同时售票,下面设计了一个程序模拟该火车站售票,通过实现Runnable接口实现(模拟网络延迟)。 伪代码: Ticket类…...
数据治理-数据质量
实现数据质量的前提就是数据本身是可靠和可信的。 导致数据质量低下的因素 组织缺乏对低质量数据影响的理解,缺乏规划、孤岛式系统设计、不一致的开发过程、不完整的文档、缺乏标准或缺乏治理等。 所有组织都会遇到与数据质量有关的问题。数据质量需要跨职能的承诺…...
[sqoop]hive3.1.2 hadoop3.1.1安装sqoop1.4.7
参考: Hadoop3.2.4Hive3.1.2sqoop1.4.7安装部署_hadoop sqoop安装_alicely07的博客-CSDN博客 一、安装 1、解压 tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/data_warehouse/module mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.72、配置文件 sqoop-env.s…...
js事件的详细介绍
11.事件 1.什么是事件 js属于事件驱动编程,把驱动,执行,调用通过一些交互,触发一些函数事件:发起-->执行绑定事件-->触发事件on 绑定 emit触发 off解绑2.事件分类 鼠标事件 点击事件 onclick 双击事件 ondblclick 按下事件 onmousedown 抬起事件 onmouseup 鼠标进…...
虚幻4学习笔记(12)操控导入的角色、动画蓝图、播放蒙太奇和打包、角色重定向
虚幻4学习笔记 操控导入的角色设置鼠标旋转关掉动态模糊 动画蓝图、播放蒙太奇和打包角色走路奔跑动画shift 奔跑F 跳舞移动打断 跳舞 打包角色重定向姿势调整解决跑步 腿分太开隐藏剑 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 操控导入的角色…...
hive with tez:无法从链中的任何提供者加载aws凭据
环境信息 hadoop 3.1.0 hive-3.1.3 tez 0.9.1 问题描述 可以从hadoop命令行正确地访问s3a uri。我可以创建外部表和如下命令: create external table mytable(a string, b string) location s3a://mybucket/myfolder/; select * from mytable limit 20; 执行正…...
Ubuntu修改静态IP、网关和DNS的方法总结
Ubuntu修改静态IP、网关和DNS的方法总结 ubuntu系统(其他debian的衍生版本好像也可以)修改静态IP有以下几种方法。(搜索总结,可能也不太对) /etc/netplan (use) Ubuntu 18.04开始可以使用netplan配置网络࿰…...
Eureka服务器注册
一。Eureka服务器注册 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…...
Windows安装GPU版本的pytorch详细教程
文章目录 chatGLM2-6B安装教程正式安装 chatGLM2-6B ChatGLM2-6B版本要装pytorch2.0,而且要2.0.1 ,因此CUDA不能用12.0 ,也不能用10.0,只能用11.x 版本。 安装教程 pip install直接下载安装 官网: https://pytorch.…...
理解Kruskal算法的前提----深入理解并查集【超简单~】
并查集的实现思路 并查集主要分为两个部分:第一部分就是需要找到点对应的祖宗节点,第二部分,是要将属于同一个集合节点的祖宗节点进行统一,也就是结合操作。 Find函数实现 // parent数组用来存储下标值所对应的父节点值 // 比如…...
Jenkins+Gitee+Docker+Ruoyi项目前后端分离部署
前言 描述:本文主要是用来记录 如何用标题上的技术,部署到云服务器上通过ip正常访问。 一、总览 1.1、Docker做的事 拉取 mysql 镜像拉取 redis 镜像拉取 jdk 镜像拉取 nginx 镜像 解释说明:前端项目的打包文件放在 nginx容器运行。后端…...
wordpress ip改域名/微信公众号推广方法有哪些
文章目录类C中可以使用struct、class来定义一个类变量名规范参考类实例化成为了对象,对象的内存空间由成员变量决定对象对象的内存布局代码段(代码区)数据段(全局区)栈空间堆空间thisthis指针必须用->,不能用. &…...
vs做网站链接sql/最新的疫情最新消息
1、通过[ javaw -jar xxx.jar ]命令实现后台运行jar程序 2、通过[ jps ]实现对jar进程的查看...
ie显示wordpress网页靠左/网络营销ppt课件
Linux上配置一个服务器环境,看了一下jdk的版本只有1.4,要换成1.6的,所以安装之前先得把jdk换成1.6的。一、Linux版本:redhat1、查看jdk的版本:输入命令:java –version返回:java version "…...
国家开发银行网站/大连中小企业网络营销
人生的低估期应该怎么度过? 先把你生活中的事情,分为3大类: 完全能掌控的 ——(投入全部精力、财力) 只能掌控一部分的 ——(投入50%精力,保持适度期待) 根本掌控不了的 ——&…...
网站开发合同是否专属管辖/网络广告网站
本文来自今日头条曹欢欢博士的分享。今天,算法分发已经是信息平台、搜索引擎、浏览器、社交软件等几乎所有软件的标配,但同时,算法也开始面临质疑、挑战和误解。今日头条的推荐算法,从2012年9月第一版开发运行至今,已经…...
天河做网站系统/营销型网站建设报价
本人屌丝本一枚,从最早的9.10京东到现在,找工作基本已经结束,除了腾讯的是暑期内推的(8.26面试的),校招期间一共面了四家,其中三家已经收到offer(京东阿里去哪儿),网易还在等通知中。如题,本人只是一个水得不能再水的本科生,大学四年,挂科5-6门的样子(这学期还要重修三门,妈蛋,…...