0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

京东云 来源:jf_75140285 作者:jf_75140285 2024-08-13 17:11 次阅读

背景

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

wKgZoma7I12Adv4CAAaUrZ8XgAk384.png

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

直观图如下:

wKgaoma7I12ANFYMAAJJs4c9l80256.png



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

解决方案

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



后续反思

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

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

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

wKgZoma7I16AVHfIAAZyJNafGQM035.png






审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2942

    浏览量

    104064
  • RPC
    RPC
    +关注

    关注

    0

    文章

    110

    浏览量

    11475
收藏 人收藏

    评论

    相关推荐

    Java中的常用异常处理方法 java推荐

    Java中,异常情况分为Exception(异常)和Error(错误)两大类,Java异常通常是指程序运行过程中出现的非正常情况,如用户输
    发表于 01-19 17:26

    为什么移植ucosii进入hardfault会引发异常

    移植完ucosii后,运行了一下,发现在任务调度时进入hardfault异常经过调试后发现是在OS_Sched()函数运行结束时引发异常,这个是调试截图,好像是在出栈指令pop引发
    发表于 08-29 04:35

    请问哪位大神可以详细介绍JavaScript拷贝和深拷贝

    JavaScript数据类型JavaScript拷贝和深拷贝
    发表于 11-05 07:16

    Java异常处理及其应用

    Java异常处理引出 假设您要编写一个 Java 程序,该程序读入用户输入的一行文本,并在终端显示该文本。 程序如下: 1 import java.io.*;2 public c
    发表于 11-09 12:03 15次下载

    java异常处理的设计与重构

    寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给
    发表于 09-27 15:40 1次下载
    <b class='flag-5'>java</b><b class='flag-5'>异常</b>处理的设计与重构

    Java常见内存溢出异常分析

    Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError
    发表于 11-28 12:48 1204次阅读

    C#拷贝与深拷贝区别解析

     所谓拷贝就是将对象中的所有字段复制到新的副本对象中;拷贝对于值类型与引用类型的方式有区别,值类型字段的值被复制到副本中后,在副本中的修改不会影响源对象对应的值;然而对于引用类型的
    发表于 11-29 08:32 2.6w次阅读
    C#<b class='flag-5'>浅</b><b class='flag-5'>拷贝</b>与深<b class='flag-5'>拷贝</b>区别解析

    java教程之如何进行Java异常处理?

    本文档的主要内容详细介绍的是java教程之如何进行Java异常处理?
    发表于 09-28 17:16 0次下载

    Python如何防止数据被修改Python中的深拷贝拷贝的问题说明

    在平时工作中,经常涉及到数据的传递。在数据传递使用过程中,可能会发生数据被修改的问题。为了防止数据被修改,就需要再传递一个副本,即使副本被修改,也不会影响原数据的使用。为了生成这个副本,就产生了拷贝——今天就说一下Python中的深拷贝
    的头像 发表于 03-30 09:54 2952次阅读
    Python如何防止数据被修改Python中的深<b class='flag-5'>拷贝</b>与<b class='flag-5'>浅</b><b class='flag-5'>拷贝</b>的问题说明

    Java异常的习题和代码分析

    Java异常的习题和代码分析
    发表于 07-08 14:54 5次下载
    <b class='flag-5'>Java</b><b class='flag-5'>异常</b>的习题和代码分析

    C++之拷贝构造函数的copy及深copy

    C++编译器会默认提供构造函数;无参构造函数用于定义对象的默认初始化状态;拷贝构造函数在创建对象时拷贝对象的状态;对象的拷贝拷贝和深
    的头像 发表于 12-24 15:31 628次阅读

    C++面向对象编程中的深拷贝拷贝

    可能对于Java程序员来说,很少遇到深浅拷贝问题,但是对于C++程序员来说可谓是又爱又恨。。
    的头像 发表于 03-30 12:53 676次阅读
    C++面向对象编程中的深<b class='flag-5'>拷贝</b>和<b class='flag-5'>浅</b><b class='flag-5'>拷贝</b>

    C++深拷贝拷贝详解

    当类的函数成员存在指针成员时会产生深拷贝拷贝和问题。
    发表于 08-21 15:05 285次阅读
    C++深<b class='flag-5'>拷贝</b>和<b class='flag-5'>浅</b><b class='flag-5'>拷贝</b>详解

    Python中拷贝与深拷贝的操作

    【例子】拷贝与深拷贝中 list1 = [ 123 , 456 , 789 , 213 ]list2 = list1list3 = list1[:] print (list2) # [ 123
    的头像 发表于 11-02 10:58 312次阅读

    Java怎么排查oom异常

    Java中的OOM(Out of Memory)异常是指当Java虚拟机的堆内存不足以容纳新的对象时抛出的异常。OOM异常是一种常见的运行时
    的头像 发表于 12-05 13:47 990次阅读