IT科技

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

时间:2010-12-5 17:23:32  作者:域名   来源:IT科技  查看:  评论:0
内容摘要:背景近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~没有任何修改的服务接口,抛出异常:jav

背景

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

copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap