java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队

背景

近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~

没有任何修改的服务接口,抛出异常:

java.lang.ClassCastException: java.util.HashMap cannot be cast to cn.xxx.xxx.xxx.xxx.BatchInfo

排查过程

1、作为资深写bug的老司机,第一感觉是传参的报文格式有问题了,可以通过模拟报文排查。于是乎,在群里圈了服务提供方同学B看下,BG快速的用测试工具+本地debug的方式,验证了下报文格式,发现居然都调用成功了。。。

2、同步服务调用同学L,重点关注:1)、调用方的序列化方式;2)、最近代码改动逻辑是否有问题。L同学确认自己逻辑没有问题后,同步B同学和S同学,看内部是否有什么处理逻辑。。。

3、第二天早上一来,快速写了单测,确认服务端收到的报文格式,的确没有问题。于是乎,开始扒代码。。。发现可疑的代码:

BeanUtils.copyProperties(item,cargoInfo)

private List<CargoInfo> convertToCargoInfo(OutboundEventCallbackRequest outboundEventCallbackRequest) {return outboundEventCallbackRequest.getCargos().stream().map(item -> {CargoInfo cargoInfo = new CargoInfo();BeanUtils.copyProperties(item, cargoInfo);return cargoInfo;}).collect(Collectors.toList());
}

PS:客户端&服务端类关系

因为BeanUtils.copyProperties属于浅拷贝,而浅拷贝只是调用子对象的set方法,并没有将所有属性拷贝(引用的一个内存地址)。所以将在进行调用时,JSF会因为反序列化时找不到对应的类,就会将其转换为Map。

直观图如下:

以上,初步定位原因,解决方式也就清晰了。

解决方案

去掉BeanUtils.copyProperties,进行手动赋值。最终解决了这个问题。

后续反思

1、想起王东岳老师的那句话,越原始的越稳定~

2、如果这种转换比较多,建议使用MapStruct

3、谨慎使用BeanUtils.copyProperties,请看:

作者:京东物流 吴义

来源:京东云开发者社区 自猿其说 Tech 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置管理员使用Local方式认证并授权用户级别示例

AAA简介 访问控制是用来控制哪些用户可以访问网络以及可以访问的网络资源。AAA是Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和Accounting&#xff08;计费&#xff09;的简称&#xff0c;提供了在NAS&#xff08;Network Access…

OpenAI大模型中的模型推理

模型推理 推理有两个方案&#xff0c;一个和训练相同&#xff0c;直接加入Lora层&#xff0c;不过会增加推理延时因为多了lora层的计算&#xff0c;适合线下测评用&#xff0c;如下 from peft import PeftModel from transformers import AutoModel, AutoTokenizer ​ model …

C# HttpWebRequest详解

HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择。它们支持一系列有用的属性。这两个类位 于System.Net命名空间&#xff0c;默认情况下这个类对于控制台程序来说是可访问的。请注意&#xff0c;HttpWebRequest对象不是利用new关键字通过构 造函数来创建…

迁移到云原生:如何使用微服务迁移应用程序

企业遇到大规模部署和监督生产中的应用程序的任务。幸运的是&#xff0c;我们可以使用大量技术和工具。然而&#xff0c;从传统的&#xff0c;整体的结构转变为云态一个人提出了自己的障碍。在这里&#xff0c;您会发现将应用程序从整体设置转移到基于微服务的体系结构时要进行…

【研究背景】基于java的流浪之家动物领养网站的设计与开发

1.选题背景 流浪之家动物领养网站的设计与开发背景主要源于对流浪动物保护和宠物领养问题的关注。随着城市化进程加快&#xff0c;越来越多的流浪动物出现在城市中&#xff0c;它们面临着食物、住所和医疗资源的缺乏。同时&#xff0c;许多爱心人士希望能够给流浪动物一个温暖…

解密负载均衡:如何平衡系统负载(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

spring boot 增量包部署,jar包变小

##pom.xml配置 <plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layout>ZIP</layout><includes><include><groupId&…

React函数组件使用Effect Hook(副作用钩子)

使用Effect Hook&#xff08;副作用钩子&#xff09; 如果你熟悉 React class 的生命周期函数&#xff0c;你可以把 useEffect Hook 看做 componentDidMount(挂载完成)&#xff0c;componentDidUpdate(更新完成) 和 componentWillUnmount&#xff08;即将销毁前&#xff09; 这…

云原生数据库性能对比(阿里云、百度智能云、腾讯云)

本文作者 LYZ 近些年&#xff0c;云原生数据库成为云厂商的重要发展方向&#xff0c;阿里云、百度智能云、腾讯云均先后发布了自研的云原生数据库。笔者认为云原生数据库具有更高的性价比、更极致的弹性&#xff0c;可以满足业务发展的不同阶段和负载场景的需求&#xff0c;也是…

FPGA高端项目:SDI 视频+音频编解码,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、设计思路和框架设计框图GV8601A均衡EQGTX 时钟要求GTX 调用与控制SMPTE SD/HD/3G-SDISMPTE SD/HD/3G-SDI 接收SMPTE SD/HD/3G-SDI 发送 SDI 视频接收数据处理SDI 音频接收-…

A Prompt Learning Framework for Source Code Summarization

Q: 这篇论文试图解决什么问题&#xff1f; A: 这篇论文试图解决的问题是自动生成代码片段的自然语言摘要&#xff08;也称为注释&#xff09;&#xff0c;这对于帮助开发人员理解和维护源代码至关重要。最近&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;在许多领…

开源minio-AWS-S3存储的部署及go操作详细

介绍 MinIO是一个开源的分布式对象存储服务&#xff0c;它允许用户在私有云或公有云环境中构建自己的对象存储基础设施。MinIO旨在提供高性能、高可用性的对象存储&#xff0c;并且与Amazon S3兼容&#xff0c;这意味着可以使用S3客户端工具和库直接与MinIO交互&#xff0c;而…

pycharm 工具栏不见了

新版pycharm后&#xff0c; 菜单栏和工具栏不见了 目录 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 我发现的解决方法&#xff1a; 其他旧版的解决方法&#xff1a; 另外&#xff0c;一些使用pycharm的新手可能会由于不熟悉软件的功能而误操作&#xff…

SystemVerilog:always_ff,always_comb,always_latch

文章目录 一、简介二、示例 一、简介 Verilog中只有一个通用的always过程块&#xff0c;SystemVerilog中追加了3个具有更明确目的专用always块。 always_ffalways_combalways_latch always_ff, always_comb, always_latch分别是用于寄存器&#xff08;flip-flop&#xff0c;…

【头歌实训】PySpark Streaming 数据源

文章目录 第1关&#xff1a;MySQL 数据源任务描述相关知识PySpark JDBC 概述PySpark JDBCPySpark Streaming JDBC 编程要求测试说明答案代码 第2关&#xff1a;Kafka 数据源任务描述相关知识Kafka 概述Kafka 使用基础PySpark Streaming Kafka 编程要求测试说明答案代码 第1关&a…

scikit-learn文档中的数据生成器

目录 1. make_classification: 2. make_regression: 3. make_blobs: 4. make_moons: 5.make_circles 6. make_sparse_coded_signal: 1. make_classification: 这是一个用于生成复杂二维数据的函数&#xff0c;通常用于可视化分类器的学习过程或者测试机器学习算法的性能…

Kali Linux如何启动SSH并在Windows系统远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

本地网络禁用了在哪里开启?

在当今数字化时代&#xff0c;网络已经成为人们生活中不可或缺的一部分。然而&#xff0c;有时我们可能需要禁用本地网络&#xff0c;无论是出于安全考虑、提高专注力还是其他原因。本文将探讨禁用本地网络的方法以及如何在需要时重新开启网络连接。 第一部分&#xff1a;禁用…

工具系列:TimeGPT_(9)模型交叉验证

交叉验证 文章目录 交叉验证外生变量比较不同的模型 时间序列预测中的主要挑战之一是随着时间的推移固有的不确定性和变异性&#xff0c;因此验证所采用的模型的准确性和可靠性至关重要。交叉验证是一种强大的模型验证技术&#xff0c;特别适用于此任务&#xff0c;因为它提供了…

抗原设计与兔单B细胞技术的结合-卡梅德生物

随着生物医学研究的不断深入&#xff0c;抗体疗法作为治疗疾病的有力工具逐渐成为研究的焦点。而兔单B细胞技术作为抗体研究的创新方法&#xff0c;其与抗原设计的有机结合为获取定制抗体打开了崭新的创新之路。本文将深入探讨抗原设计与兔单B细胞技术相互融合的原理、优势&…