首页 > 编程语言 >java浅拷贝BeanUtils.copyProperties引发的RPC异常

java浅拷贝BeanUtils.copyProperties引发的RPC异常

时间:2024-11-11 10:46:17浏览次数:1  
标签:java cargoInfo xxx RPC copyProperties 拷贝 BeanUtils

作者:京东物流 吴义

背景

近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,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,请看:

 


 

 

 

标签:java,cargoInfo,xxx,RPC,copyProperties,拷贝,BeanUtils
From: https://www.cnblogs.com/Jcloud/p/18539287

相关文章

  • 代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)
    代码1、长度最小的子数组⭐使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内层循环将i指针......
  • 「Java开发指南」如何自定义Spring代码生成?(二)
    搭建用户经常发现自己对生成的代码进行相同的修改,这些修改与个人风格/偏好、项目特定需求或公司标准有关,本教程演示自定义代码生成模板,您将学习如何:创建自定义项目修改现有模板来包含自定义注释使用JET和Skyway标记库中的标记配置项目来使用自定义在上文中,我们为大家介绍了......
  • JavaScript变量
    变量是用于存储信息的"容器"。实例varx=5;vary=6;varz=x+y;尝试一下»就像代数那样x=5y=6z=x+y在代数中,我们使用字母(比如x)来保存值(比如5)。通过上面的表达式z=x+y,我们能够计算出z的值为11。在JavaScript中,这些字母被称为变量。您可以把变量看做存储数......
  • java计算机毕业设计电脑销售管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今数字化的时代,电脑销售行业竞争日益激烈。随着市场的不断扩大,电脑产品的种类繁多,销售渠道也日益多样化,传统的管理方式已经难以满足企业高效......
  • java计算机毕业设计大学实验室app(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着大学教育的不断发展,实验室在教学、科研等方面的作用日益凸显。在当今数字化时代,传统的实验室管理方式已难以满足高效、便捷管理的需求。传统......
  • java计算机毕业设计大学生创新实践成果管理与分析推荐系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在现代高等教育体系中,大学生创新实践活动日益受到重视,其是培养学生创新能力、实践能力和综合素质的关键途径。随着高校教育的不断发展,大学生参与......
  • JavaScript语法
    JavaScript 语法JavaScript是一个程序语言。语法规则定义了语言结构。JavaScript语法JavaScript是一个脚本语言。它是一个轻量级,但功能强大的编程语言。JavaScript字面量在编程语言中,一般固定值称为字面量,如3.14。数字(Number)字面量 可以是整数或者是小数,或者是科......
  • javaweb关于中文乱码问题
    javaweb文件中中文乱码问题除了好多次,总是解决不完,现在总结一下处理中文乱码的方法:客户端发送的数据编码问题:确保客户端(如浏览器)发送的数据确实是UTF-8编码的。您可以在浏览器的开发者工具中检查请求头中的Content-Type字段,确保它包含charset=UTF-8。服务器配置问题:检查......
  • 【IT人物系列】之Java之父
    前言当今世界由无数的人构成,其中有些人做了一些改变世界的事情,比如:乔布斯缔造了Apple帝国,‌詹姆斯·高斯林创造了Java语言等。正是这些优秀的人做的这些优秀的事情,让这个世界更加美好。因此他们值得铭记。从今天起,会持续更新这些大人物的相关文章。分享他们的经历,成就,希望......
  • JavaScript语法进阶:事件监听与处理
    一、概述事件定义了用户与网页交互时产生的各种操作。例如,单击按钮时,就产生一个事件,告诉浏览器发生了需要进行处理的单击操作。为了使对象能够对某一事件做出响应,就必须编写事件处理函数。事件处理函数是一段独立的程序代码,它在对象检测到某个特定事件时执行(响应该事件)。一个......