南通哪里有做网站的,泉州模板建站公司,文化建设设计网站,濮阳网络电视直播背景
近期参与了一个攻坚项目#xff0c;前期因为其他流程原因#xff0c;测试时间已经耽搁了好几天了#xff0c;本以为已经解决了卡点#xff0c;后续流程应该顺顺利利的#xff0c;没想到 人在地铁上#xff0c;bug从咚咚来~
没有任何修改的服务接口#xff0c;抛出…背景
近期参与了一个攻坚项目前期因为其他流程原因测试时间已经耽搁了好几天了本以为已经解决了卡点后续流程应该顺顺利利的没想到 人在地铁上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 ListCargoInfo 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 转载请注明来源