当前位置: 首页 > news >正文

链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值

反序列化后发现属性为null

昨天使用fastjsonJSON.parseArray(json, class)反序列化的时候,发现返回的list列表中的对象某个属性为null,但是json字符串里面这个属性是有值的,经过排查发现是因为子类重写了父类的set方法,且返回值类型是父类导致的。
几个解决方法

  • 不重写方法,不重写就肯定没这个问题了
  • 重写方法的返回值类型改成自身,这个是因为fastjson代码处理了返回值不是自身或者void的情况,所以改成自身就好了,推荐这种。
  • 私有属性改成public,这个肯定也不太好
  • 先转成JSONArray对象,再通过其他类似toMap转换,这种不推荐

对照试验

为了做一个对比,写两组代码,一组子类不重写父类的set方法,另外一组重写父类的set方法。为了减少代码量,使用lombok的注解,Accessors(chain = true)代表链式调用。Parent类有xy两个属性,Children类继承Parent类,有一个z属性。
构造一个json数组,里面有两个对象,然后用fastjson解析。

[{"x":"x值","y":"y值","z":"z值"},{"x":"x值2","y":"y值2","z":"z值2"}]

不重写set方法的代码

子类不重写父类的set方法,将json字符串解析成Children集合,运行代码看输出,xyz属性都有值

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;import java.util.List;public class JsonParseTest {public static void main(String[] args) {String jsonText = "[{\"x\":\"x值\",\"y\":\"y值\",\"z\":\"z值\"},{\"x\":\"x值2\",\"y\":\"y值2\",\"z\":\"z值2\"}]";List<Children> oldRuleDetailList = JSON.parseArray(jsonText, Children.class);System.out.println(oldRuleDetailList);}
}@Setter
@Getter
@ToString
@Accessors(chain = true)
class Parent {private String x;private String y;
}@Setter
@Getter
@ToString(callSuper = true)
@Accessors(chain = true)
class Children extends Parent {private String z;
}

运行截图:
在这里插入图片描述
因为是链式调用方式,所以set系列方法返回值都是this。比如Parent
在这里插入图片描述

重写父类set方法的代码

为了模拟昨天的情况,在Children类中重写父类的setX方法,返回值类型还是Parent类。运行代码发现,x属性值为null,其他属性值正常。运行结果说明昨天遇到的问题就是因为我在子类里面重写了父类的set方法导致。
昨天出现这个问题之后,我是把那个方法返回值类型改成了Children类,但当时并不知道为什么改了就有值,不改就没有值。

@Setter
@Getter
@ToString(callSuper = true)
@Accessors(chain = true)
class Children extends Parent {private String z;/*** 重写父类的setX方法*/@Overridepublic Parent setX(String x) {return super.setX(x);}
}

运行截图:
在这里插入图片描述

debug源码排查

为了排查问题,拿重写父类set方法的代码进行debug。

  1. 首先调用JSON.parseArray方法解析json字符串,传入json字符串和ChildrenClass对象
    在这里插入图片描述
  2. JSONparseArray方法会创建一个list集合,然后调用DefaultJSONParser类的parseArray方法来解析
    在这里插入图片描述
  3. DefaultJSONParser里面的parseArray方法里面,会根据要传入的class类型,创建不同的反序列化工具对象。
    在这里插入图片描述
  4. 调用getDeserializer方法获取反序列化工具对象,里面的get方法会从缓存里面拿,因为是第一次执行,所以拿到的是null,就会往后执行,最后调用重载的同名方法。在重载的方法里面,会进行各种判断,比如是不是枚举类,是不是特定的java类等等。因为我们是自定义的类,所以最后会调用createJavaBeanDeserializer方法。
    在这里插入图片描述
    在这里插入图片描述
  5. createJavaBeanDeserializer方法里面判断要不要使用asm,因为父类不是public声明的,所以不使用asm,最后是创建一个JavaBeanDeserializerjavaBean反序列化工具类对象并返回。
    在这里插入图片描述
    在这里插入图片描述
  6. JavaBeanDeserializer构造方法中,会调用JavaBeanInfo.build方法,build方法里面会拿到传入类的所有非私有方法(里面会包含父类的非私有方法),然后循环遍历这个方法数组进行处理,找出setXXX相关的方法。它主要就是根据setXXX后面的XXX来确定是什么属性的。最重要的就是在循环方法数组的里面会判断这个要不要继续处理,比如静态方法就跳出。前面遇到的问题正是因为这个循环体里面的一个判断导致的。
    在这里插入图片描述
    在这里插入图片描述
    710行的代码,判断了方法返回值类型,如果是void或者自身,就往下执行,否则跳过,这就是为什么重写了父类的set方法,返回值类型是父类x就没有值,改成自己就有值的原因了。
    在这里插入图片描述
    fieldList对象里面只有yz属性
    在这里插入图片描述

相关文章:

链式调用方式重写父类set方法导致fastjson解析的对象属性未赋值

反序列化后发现属性为null 昨天使用fastjson的JSON.parseArray(json, class)反序列化的时候&#xff0c;发现返回的list列表中的对象某个属性为null&#xff0c;但是json字符串里面这个属性是有值的&#xff0c;经过排查发现是因为子类重写了父类的set方法&#xff0c;且返回值…...

[AUTOSAR 基础入门] - AUTOSAR配置工具

返回总目录 前文我们提到了要借助 EasySAR 平台来助力大家更好地融合 AUTOSAR 的理论与实践&#xff0c;让大家能够切实将所学知识转化为实际操作能力。建议大家感兴趣的去注册一下看看。跳转链接&#xff1a;EasySAR EasySAR是昂辉科技基于 AUTOSAR 方法论设计的一款面向汽车…...

鸿蒙开发:实现键值数据库存储

前言 鸿蒙当中数据持久化存储&#xff0c;为我们提供了多种的实现方式&#xff0c;比如用户首选项方式&#xff0c;关系型数据库方式&#xff0c;键值型数据库方式&#xff0c;文件存储方式等等&#xff0c;对于数据量比较的小的&#xff0c;我们直接选择轻量级的用户首选项方式…...

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…...

CSS——1.优缺点

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><link rel"stylesheet" type"text/css" href"1-02.css"/></head><body><!--css&#xff1a;层叠样式表…...

Android设备使用AOA协议进行主机与配件模式通信

1.使用TYPC-C数据线连接两台华为手机&#xff1a; TYPE-C线&#xff0c;先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权&#xff0c;然后会启动右边的AccessoryChart USB HOS…...

MySQL中深度分页问题的优化

MySQL中深度分页问题的优化 在MySQL中&#xff0c;使用LIMIT子句进行分页查询时&#xff0c;可能会遇到一个常见的性能问题&#xff1a;当LIMIT子句中的偏移量X很大时&#xff0c;查询速度会显著下降。例如&#xff0c;LIMIT 0,10可能只需要20毫秒&#xff0c;而LIMIT 1000000,…...

5. C语言 常量与宏定义

本章目录: 前言一、什么是常量&#xff1f;1. 整型常量2. 浮点型常量3. 字符常量4. 字符串常量 二、如何定义常量&#xff1f;1. 使用 #define 宏定义2. 使用 const 关键字 三、#define 和 const 的区别四、使用建议1. 使用场景区分2. 避免宏定义的潜在问题 五、特殊用法与小技…...

【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查

简单的数据查询&#xff0c;我们可以在mapper接口里面去实现&#xff0c;但是如果是复杂的查询&#xff0c;我们就可以使用xml配置文件去做&#xff0c; 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构&#xff0c;在resources包里面新建同名同结构的xml文件…...

spring防止重复点击,两种注解实现(AOP)

第一种&#xff1a;EasyLock 简介 为了简化可复用注解&#xff0c;自己实现的注解&#xff0c;代码简单随拿随用 使用方式 1.创建一个注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface EasyLock {long waitTime() default …...

Spring Boot 3 实现 MySQL 主从数据库之间的数据同步

✅ Spring Boot 3 实现 MySQL 主从数据库之间的数据同步 在实际项目中,为了提高 系统的读性能 和 数据的可用性,通常会使用 主从数据库架构。Spring Boot 提供了对 多数据源 的良好支持,可以轻松配置 主从数据库 的数据同步,实现 读写分离。 🎯 方案介绍 我们将通过 Sp…...

WPS-JS宏快速上手

WPS JS宏注意事项 代码后面可以不写分号“ ; ”&#xff1b; 缩进对程序的运行影响不大&#xff0c;但为了易读&#xff08;防止自己以后看不懂&#xff09;&#xff0c;还是乖乖写好&#xff1b; 代码是逐行运行的&#xff0c;意味着下面一行代码错了&#xff0c;前面的代码…...

力扣hot100——堆

215. 数组中的第K个最大元素 快速排序 class Solution { public:int findKthLargest(vector<int>& a, int k) {auto qsort [&](this auto&& qsort, int l, int r) -> void {if (l r) return;int i l - 1, j r 1;int x a[(l r) / 2];/*如果把…...

【小制作】米家模拟手指点击

代码功能解释 这段代码是一个基于Arduino平台的控制程序&#xff0c;主要功能包括&#xff1a; 初始化&#xff1a;设置引脚模式、初始化编码器、舵机和EEPROM。按键检测&#xff1a;处理按钮的单击、双击和长按事件&#xff0c;并根据事件执行相应操作。编码器更新&#xff…...

ubuntu1604 apt镜像源切换

1、如何查看当前源 cat /etc/apt/sources.list less /etc/apt/sources.list 2、apt源修改为阿里镜像&#xff0c;这里ubuntu是1604&#xff1a; deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/…...

leetcode刷题笔记

题目思路1.两数之和哈希表2.两数相加链表操作3. 无重复字符的最长子串滑动窗口&#xff0c;特别注意数组越界情况&#xff01;4. 寻找两个正序数组的中位数5.最长回文子串从中间向两边扩展&#xff0c;注意整个字符串都是回文串的边界情况10.正则表达式匹配动态规划&#xff0c…...

修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]

对于 iDevice 用户来说&#xff0c;只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道&#xff0c;iTunes 并不是一款高效的应用程序&#xff0c;有时性能会很差&#xff0c;例如在 iDevices 和计算机之间传输文件时不断…...

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作 安装MySQL 8.4.3 参考博主之前的文档&#xff0c;在本地Mac安装好MySQL&#xff1a;Mac M2 Pro安装MySQL 8.4.3安装目录&#xff1a;/usr/local/mysql&#xff0c;安装好的MySQL都处于运行状态&#xff0c;需要先停止MySQL服务最快的方式&#xff1a;系统设置 …...

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…...

handpose x plus 数据解析 >> DataBall

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” ---------------------------- 样品数据&#xff1a; 通过加入知识…...

LINUX线程操作

文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态&#xff08;New&#xff09;就绪状态&#xff08;Runnable&#xff09;运行状态&#xff08;Running&#xff09;阻塞状态&#xff08;Blocked&#xff09;死亡状态&#…...

每日一学——日志管理工具(ELK Stack)

5.1 ELK Stack 5.1.1 Elasticsearch索引机制 嘿&#xff0c;小伙伴们&#xff01;今天我们要聊聊ELK Stack——一套由Elasticsearch、Logstash和Kibana组成的强大日志管理工具集。通过这套工具&#xff0c;我们可以轻松地收集、存储、搜索和可视化日志数据。首先&#xff0c;…...

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用&#xff0c;尤其是在需要集成…...

【Leetcode】732. 我的日程安排表 III

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 当 k k k 个日程存在一些非空交集时&#xff08;即, k k k 个日程包含了一些相同时间&#xff09;&#xff0c;就会产生 k k k 次预订。 给你一些日程安排 [startTime, endTime…...

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio&#xff0c;打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件&#xff0c;将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包&#xff0c;应用的名称…...

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…...

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…...

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…...

高等数学学习笔记 ☞ 极限的运算法则与存在准则

1. 极限的运算法则 &#xff08;1&#xff09;有限个无穷小的和是无穷小。 &#xff08;2&#xff09;有限个无穷小的乘积是无穷小。 备注&#xff1a; ①&#xff1a;无限个无穷小的和不一定是无穷小&#xff0c;反例如下&#xf…...

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…...

k8s集群,CRI-Docker部署条件及方法

CRI-Docker部署条件及方法 文章目录 CRI-Docker部署条件及方法CRI-Docker使用条件安装 cri-docker 的步骤&#xff1a; CRI-Docker使用条件 在 Kubernetes 1.20 及以上版本&#xff0c;kubeadm 默认使用 containerd 作为容器运行时&#xff08;Container Runtime Interface, C…...

STLG_01_09_程序设计C语言 - 指针

C语言中的指针是一个非常重要的概念&#xff0c;它允许程序直接访问和操作内存地址。理解指针对于掌握C语言编程至关重要。 1. 指针的基本概念 指针&#xff1a;指针是一个变量&#xff0c;它存储的是另一个变量的内存地址。指针变量&#xff1a;指针变量专门用来存储内存地址…...

Seaborn的分类柱状图sns.barplot()

Seaborn的分类柱状图sns.barplot 一、sns.barplot()参数详解二、代码实现一、sns.barplot()参数详解 sns.barplot 是 Seaborn 库中用于绘制分类柱状图(bar chart)的函数。Seaborn 是一个基于 Matplotlib 的数据可视化库,它提供了更高级别的接口来绘制统计图形,并且有更…...

SpringBoot入门之创建一个Hello World项目

文章目录 一、创建一个SpringBoot项目二、配置pom.xml文件三、下载Maven依赖四、创建一个Controller类&#xff1a;com.devops.controller.HelloController五、创建一个引导类&#xff1a;com.devops.HelloApplication六、启动项目七、访问8080八、完整项目结构九、参考视频 一…...

MAC系统QT Creator的快捷键

安装好QT Creator后使用了一段时间&#xff0c;真是越用越难受&#xff0c;只想说&#x1f5d1;️。。。 找一圈qt creator的快捷键 0. 快捷键界面 这里的搜索真的是…无语&#xff0c;不考虑是人查找吗&#xff1f;&#xff1f; 1. 代码前后浏览 2. 移动代码 3. 半自动导入…...

qml Rectangle详解

1、概述 Rectangle是Qt Quick中的一个基础图形元素&#xff0c;用于在QML界面上绘制一个可带边框和可填充的矩形区域。它继承自Item类&#xff0c;因此具有Item的所有属性和功能&#xff0c;如位置、尺寸、变换等。通过Rectangle&#xff0c;可以创建各种矩形形状&#xff0c;…...

C语言中关于数据类型带来的陷阱

前言 笔者在阅读《深入理解计算机系统》时&#xff0c;理解了为何C语言被称为不安全语言&#xff0c;C语言除了指针非常灵活可能会导致大量漏洞之外&#xff0c;C语言的无符号数据也可能带来致命性危害。 扩展一个数据的表示 将一个无符号数转换为更大的数据类型&#xff0c…...

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…...

【AimRT】AimRT Hello World

目录 一、工程结构二、源码说明/CMakeLists.txt/cmake/GetAimRT.cmake/src/CMakeLists.txt/src/module/helloworld_module/CMakeLists.txt/src/app/helloworld_app/CMakeLists.txt/src/install/cfg/helloworld_cfg.yaml/src/module/helloworld_module/helloworld_module.h/src/…...

在Typora中实现自动编号

文章目录 在Typora中实现自动编号1. 引言2. 准备工作3. 自动编号的实现3.1 文章大纲自动编号3.2 主题目录&#xff08;TOC&#xff09;自动编号3.3 文章内容自动编号3.4 完整代码 4. 应用自定义CSS5. 结论 在Typora中实现自动编号 1. 引言 Typora是一款非常流行的Markdown编辑…...

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…...

Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决

在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中&#xff0c;哨兵模式&#xff08;Sentinel&#xff09;是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵&#xff0c;我们可以实现 Redis 集群的监控、故障检测和…...

数据库设计

数据库设计全攻略:从理论到实践 在当今数字化驱动的世界里,数据已然成为企业和组织最为宝贵的资产之一。而数据库,作为数据的“栖息地”,其设计的优劣直接关系到整个信息系统的性能、可维护性以及能否高效满足业务需求。一个精心构思的数据库设计方案,就如同为一座高楼打…...

三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇

一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…...

【2025软考高级架构师】案例题重点知识——第一部分

1.架构风格相关问题 什么是架构风格? 软件架构风格类似于建筑风格,从相同类型的软件系统中抽取其架构的共性,是一种惯用模式,反映了众多系统共有的结构和语义 (1)软件架构为软件系统提供了一个结构、行为和属性的高级抽象。 (2)软件架构风格是特定应用领域的惯用模式,架…...

Science Robotics让软机器人“活”得更久的3D打印!

软机器人硬件在医疗、探索无结构环境等领域有广泛应用&#xff0c;但其生命周期有限&#xff0c;导致资源浪费和可持续性差。软机器人结合软硬组件&#xff0c;复杂组装和拆卸流程使其难以维修和升级。因此&#xff0c;如何延长软机器人的生命周期并提高其可持续性成为亟待解决…...

【JVM】总结篇-运行时内存篇

文章目录 JVM内存模型&#xff08;内存结构&#xff09;程序计数器 pc虚拟机栈本地方法栈 native堆堆空间堆中一些JVM参数堆中垃圾回收过程MinorGC MajorGC FullGC年轻代GC(Minor GC)触发机制&#xff1a;老年代GC&#xff08;Major GC/Full GC&#xff09;触发机制&#xff1a…...

【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

【数据仓库】hive on Tez配置

hive on Tez 搭建 前提是hive4.0hadoop3.2.2数仓已搭建完成&#xff0c;现在只是更换其执行引擎 为Tez。搭建可参考【数据仓库】hive hadoop数仓搭建实践文章。 Tez 下载 下载地址 https://archive.apache.org/dist/tez/ 官网地址 https://tez.apache.org/releases/apac…...

基于HTML和CSS的旅游小程序

一、技术基础 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言&#xff0c;用于定义网页的内容和结构。在旅游小程序中&#xff0c;HTML用于搭建页面的基本框架&#xff0c;包括标题、段落、图片、链接等元素&#xff0c;以及用于交互的表单…...