fastjson在kotlin+java混合項目中的bug

fastjson在kotlin+java混合項目中的bug

環(huán)境

kotlin 1.3 + java 8 + fastjson 1.2.62

問題

最近在項目中遇到一個問題,測試小伙伴反饋在測試環(huán)境用著用著突然就接口調用失敗,查看日志是報這個錯誤:


image

試了一下其他接口,也是一樣的問題,可就在幾分鐘前還一切OK,開發(fā)本地調試也一切完好,就訪問云端的鏡像報錯。找這個報錯的原因,已經寫得很明白了,fastjson反序列化時沒有找到默認構造函數。

看起來似乎是在調用云端鏡像時某個時刻觸發(fā)了一個事件,導致云端應用狀態(tài)變化,進而導致后續(xù)的接口調用失敗。

基于此猜測我們重啟了云端應用進行驗證,果不其然,重啟后一切恢復正常。那么是觸發(fā)了什么事件導致后續(xù)調用失敗呢?

于是開發(fā)小哥嘗試復現問題,正在嘗試復現,測試小伙伴又反饋報錯了,趕緊抓住現場!

一番溝通后還原測試小伙伴的操作,果然,某個操作會導致一個異常:


image

出現此異常后,后續(xù)的接口調用都會失敗。但此異常不影響業(yè)務,所以在客戶端不易被察覺。

原因分析

分析上訴拋出的異常是在fastjson的TypeUtils.java中:


image

進一步分析,為什么constructor為null?

留意一下發(fā)現這里clazz變量的類型時kotlin.Unit,這相當于java中的void

/**
 * The type with only one value: the `Unit` object. This type corresponds to the `void` type in Java.
 */
public object Unit {
    override fun toString() = "kotlin.Unit"
}

用了object關鍵字進行對象聲明,是不帶構造函數的,所以迭代器變量it中沒有迭代對象,constructor就為null了。于是代碼邏輯進入到catch,在catch中會把kotlin_error置為true,后續(xù)的請求到這里就直接返回null了:


image

為什么會出現kotlin.Unit的序列化操作呢?

kotlin默認把沒有返回值的函數當做返回kotlin.Unit,如果把沒有返值的函數丟給fastjson反序列化就會導致此問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容