使用kotlin语言,引入fastjson库,调用JSON.parseObject()函数,结果报了"default constructor not found"的错误。
提示是没有default构造函数,查看DownloadEventMsgDto类,是写了一个无参数的构造函数的:
上网查资料,解决方式是使用版本低一些fastjson,我现在用的是1.2.46,将其改为1.2.32,问题解决。
kotlin如何使用1.2.46?
加入以下依赖,修改一下类的构造函数即可。
<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) {
}
怎么解决的
进入fastjson1.2.46的源码,通过dubug打断点,首先我发现了它寻找构造函数的第一步是先找有@JSONCreator的构造函数,找不到则采用第二种方法找,在用第二种方法找时,会进入TypeUtils的getKotlinConstructorParameters()函数,这个函数会寻找"kotlin.reflect.jvm.internal.KClassImpl"类,找不到则会返回null,然后报没有构造函数的错误。
于是我就给构造函数加上了@JSONCreator的注解
@JSONCreator constructor() : this(0, "") {
}
再运行时报了空指针异常
再次打断点观察,又是在TypeUtils的getKotlinConstructorParameters()函数寻找"kotlin.reflect.jvm.internal.KClassImpl"类,找不到则返回null。
去网上查kotlin.reflect.jvm.internal.KClassImpl相关资料,发现这是kotlin的一个反射库,需要自己引入,于是搜索 "kotlin-reflect maven"第一个内容就是maven仓库的网站。
其实这个问题如果报"找不到kotlin.reflect.jvm.internal.KClassImpl"的错误会好解决的多。