1.問題
應用A向應用B發起HTTP請求獲取數據,數據中包含日期格式的屬性Time。應用B在返回數據給應用A之前對日期Time進行了格式化,轉換成了時間戳。假設Time格式化前為‘2020-11-08 00:22:35’,對應的時間戳為‘1468905’。發現應用A接收到數據后Time的值確實是‘1468905’,然而應用A在對數據進行格式化后發現Time卻不是‘2020-11-08 00:22:35‘,而是服務器當前時間!
2.排查
首先確定了日期轉換為時間戳沒有錯誤,問題出在了格式化工具上——net.sf.json.JSONObject。
通過Debug發現,應用A對接收到的數據進行格式化的時候,對於屬性Time接收到的類型是Long,而期望的類型是Date。實際類型與期望類型不符合,判斷為真:
if (!targetType.isInstance(value)) {
setProperty(bean, key, morphPropertyValue(key, value, type, targetType), jsonConfig);
}
在morphPropertyValue方法中意圖利用反射從Long類型的Class中找到date屬性,然后將時間戳賦給date......
//sourceBean:就是Long類型的時間戳
//name:意圖尋找到date屬性
PropertyDescriptor sourcePd = PropertyUtils.getPropertyDescriptor(sourceBean, name);
結果可想而知,它死活找不到。最后返回服務器當前時間......
3.解決
不去拷貝屎前代碼;
用FastJSON。
