背景
近期參與了一個攻堅項目,前期因為其他流程原因,測試時間已經(jīng)耽擱了好幾天了,本以為已經(jīng)解決了卡點,后續(xù)流程應該順順利利的,沒想到 人在地鐵上,bug從咚咚來~
沒有任何修改的服務接口,拋出異常:
java.lang.ClassCastException: java.util.HashMap cannot be cast to cn.xxx.xxx.xxx.xxx.BatchInfo
排查過程
1、作為資深寫bug的老司機,第一感覺是傳參的報文格式有問題了,可以通過模擬報文排查。于是乎,在群里圈了服務提供方同學B看下,BG快速的用測試工具+本地debug的方式,驗證了下報文格式,發(fā)現(xiàn)居然都調用成功了。。。
2、同步服務調用同學L,重點關注:1)、調用方的序列化方式;2)、最近代碼改動邏輯是否有問題。L同學確認自己邏輯沒有問題后,同步B同學和S同學,看內部是否有什么處理邏輯。。。
3、第二天早上一來,快速寫了單測,確認服務端收到的報文格式,的確沒有問題。于是乎,開始扒代碼。。。發(fā)現(xiàn)可疑的代碼:
BeanUtils.copyProperties(item,cargoInfo)
private List 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,進行手動賦值。最終解決了這個問題。
?
后續(xù)反思
1、想起王東岳老師的那句話,越原始的越穩(wěn)定~
2、如果這種轉換比較多,建議使用MapStruct
3、謹慎使用BeanUtils.copyProperties,請看:
?
?
審核編輯 黃宇
-
JAVA
+關注
關注
19文章
2977瀏覽量
105227 -
RPC
+關注
關注
0文章
111瀏覽量
11585
發(fā)布評論請先 登錄
相關推薦
Java中的常用異常處理方法 java推薦
為什么移植ucosii進入hardfault會引發(fā)異常?
Java異常處理及其應用
java異常處理的設計與重構
![<b class='flag-5'>java</b><b class='flag-5'>異常</b>處理的設計與重構](https://file.elecfans.com/web2/M00/49/E1/pYYBAGKhvG-ANqg1AAAnf5uahXc323.png)
Java常見內存溢出異常分析
C#淺拷貝與深拷貝區(qū)別解析
![C#<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>與深<b class='flag-5'>拷貝</b>區(qū)別解析](https://file1.elecfans.com//web2/M00/A6/F9/wKgZomUMQZKAAp9MAAAfiC8vtIs110.png)
Python如何防止數(shù)據(jù)被修改Python中的深拷貝與淺拷貝的問題說明
![Python如何防止數(shù)據(jù)被修改Python中的深<b class='flag-5'>拷貝</b>與<b class='flag-5'>淺</b><b class='flag-5'>拷貝</b>的問題說明](https://file.elecfans.com/web1/M00/8C/AE/o4YBAFyezOSAKVmmAAAO945as_g559.png)
評論