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

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

时间:2024-08-13 18:06:59浏览次数:13  
标签: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/18357463

相关文章

  • 一个基于 Java 接口参数加密框架,让接口参数加密变得简单、优雅!
    SecurityApiv1.0.1一个基于Java接口参数加密框架,让接口参数加密变得简单、优雅!文章目录一、SecurityApi介绍二、SecurityApi依赖三、使用1.RSA加密(非对称加密)1.1简单示例1.2生成RSA密钥1.3加签名说明「第一个场景」B要给A传递一条加密消息「第二个场景」B......
  • 计算机毕业设计推荐-基于java的地方特色美食分享管理系统
    ......
  • 计算机毕业设计推荐-基于Java的流浪宠物援助平台【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......
  • Java解决递归造成的堆栈溢出问题
    在Java中,递归造成的堆栈溢出问题通常是因为递归调用的深度过大,导致调用栈空间不足。解决这类问题的一种常见方法是使用非递归的方式重写算法,即使用迭代替代递归。1.方法一:非递归的方式重写算法(迭代替代递归)下面通过一个典型的递归例子——计算斐波那契数列的第n项,来演示如何用迭......
  • SpringBoot项目创建报错——解决Intellij idea Error:java: 无效的源发行版: 16
    错误信息java:错误:无效的源发行版:16分析我的JDK版本为1.8,创建SpringBoot项目时只有jdk21、22,SpringBoot版本也只有3.x.x,而jdk8仅兼容2.x.x,由此造成了不兼容解决先把所有jdk版本统统改成一样的先打开ProjectStructure再打开Setting还需要改下pom.xml文件的jdk版......
  • Java基础继续
    Java基础继续类型转换Java是强类型语言,在运算的时候,需要用到类型转换运算中,不同类型的数据先转换成同一个类型,然后进行运算publicclassDemo04{publicstaticvoidmain(String[]args){inti=128;byteb=(byte)i;//强制类型转换d......
  • JavaScript 中的宏任务与微任务
    JavaScript是一种单线程的编程语言,这意味着在同一时间只能执行一个任务。为了有效地处理并发操作,JavaScript引入了事件循环(EventLoop)机制,其中宏任务(MacroTask)和微任务(MicroTask)在其中扮演着关键角色。1.什么是宏任务和微任务?宏任务(MacroTask)是JavaScript中执行的大......
  • Java计算机毕业设计的老年公寓管理系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的老龄化进程加速,老年人口数量显著增加,对养老服务的需求也日益多样化与专业化。传统家庭养老模式面临诸多挑战,如子女工作压力大、居住条件限......
  • Java计算机毕业设计的旅游攻略系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,人们对于旅行的需求日益多样化与个性化,传统的旅游方式已难以满足现代游客的高效、便捷与深度体验需求。在信息爆炸的时代背景下......
  • Java计算机毕业设计的非物质文化遗产博物馆系统(开题+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球化与现代化的浪潮中,非物质文化遗产作为民族历史记忆与文化多样性的重要载体,正面临着前所未有的挑战与冲击。随着时间的推移,许多珍贵的非物质文......