使用kotlin語言,引入fastjson庫(kù),調(diào)用JSON.parseObject()函數(shù),結(jié)果報(bào)了"default constructor not found"的錯(cuò)誤。
提示是沒有default構(gòu)造函數(shù),查看DownloadEventMsgDto類,是寫了一個(gè)無參數(shù)的構(gòu)造函數(shù)的:
上網(wǎng)查資料,解決方式是使用版本低一些fastjson,我現(xiàn)在用的是1.2.46,將其改為1.2.32,問題解決。
kotlin如何使用1.2.46?
加入以下依賴,修改一下類的構(gòu)造函數(shù)即可。
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>1.3.31</version>
</dependency>
data class DownloadEventMsgDto(var id: Int, var filePathAndName: String) {
}
怎么解決的
進(jìn)入fastjson1.2.46的源碼,通過dubug打斷點(diǎn),首先我發(fā)現(xiàn)了它尋找構(gòu)造函數(shù)的第一步是先找有@JSONCreator的構(gòu)造函數(shù),找不到則采用第二種方法找,在用第二種方法找時(shí),會(huì)進(jìn)入TypeUtils的getKotlinConstructorParameters()函數(shù),這個(gè)函數(shù)會(huì)尋找"kotlin.reflect.jvm.internal.KClassImpl"類,找不到則會(huì)返回null,然后報(bào)沒有構(gòu)造函數(shù)的錯(cuò)誤。
于是我就給構(gòu)造函數(shù)加上了@JSONCreator的注解
@JSONCreator constructor() : this(0, "") {
}
再運(yùn)行時(shí)報(bào)了空指針異常
再次打斷點(diǎn)觀察,又是在TypeUtils的getKotlinConstructorParameters()函數(shù)尋找"kotlin.reflect.jvm.internal.KClassImpl"類,找不到則返回null。
去網(wǎng)上查kotlin.reflect.jvm.internal.KClassImpl相關(guān)資料,發(fā)現(xiàn)這是kotlin的一個(gè)反射庫(kù),需要自己引入,于是搜索 "kotlin-reflect maven"第一個(gè)內(nèi)容就是maven倉(cāng)庫(kù)的網(wǎng)站。
其實(shí)這個(gè)問題如果報(bào)"找不到kotlin.reflect.jvm.internal.KClassImpl"的錯(cuò)誤會(huì)好解決的多。