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

試了一下其他接口,也是一樣的問題,可就在幾分鐘前還一切OK,開發(fā)本地調試也一切完好,就訪問云端的鏡像報錯。找這個報錯的原因,已經寫得很明白了,fastjson反序列化時沒有找到默認構造函數。
看起來似乎是在調用云端鏡像時某個時刻觸發(fā)了一個事件,導致云端應用狀態(tài)變化,進而導致后續(xù)的接口調用失敗。
基于此猜測我們重啟了云端應用進行驗證,果不其然,重啟后一切恢復正常。那么是觸發(fā)了什么事件導致后續(xù)調用失敗呢?
于是開發(fā)小哥嘗試復現問題,正在嘗試復現,測試小伙伴又反饋報錯了,趕緊抓住現場!
一番溝通后還原測試小伙伴的操作,果然,某個操作會導致一個異常:

出現此異常后,后續(xù)的接口調用都會失敗。但此異常不影響業(yè)務,所以在客戶端不易被察覺。
原因分析
分析上訴拋出的異常是在fastjson的TypeUtils.java中:

進一步分析,為什么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了:

為什么會出現kotlin.Unit的序列化操作呢?
kotlin默認把沒有返回值的函數當做返回kotlin.Unit,如果把沒有返值的函數丟給fastjson反序列化就會導致此問題。