我读到了Kotlin数据类,并认为它们在描述数据传输对象(DTO)的情况下非常有用 . 在我的Java项目中,我已经有了用Java编写的DTO类,类似于:
public class Tweet {
private String id;
private String profileId;
private String message;
public Tweet() {}
public String getId() {
return id;
}
public String getProfileId() {
return profileId;
}
public String getMessage() {
return message;
}
public void setId(String id) {
this.id = id;
}
public void setProfileId(String profileId) {
this.profileId = profileId;
}
public Tweet setMessage(String message) {
this.message = message;
return this;
}
}
这些DTO类存储在单独的工件中,我将其添加为其他工件的依赖项 . 所以,我决定用Kotlin类替换它,并在Kotlin上重写了提到的Tweet类,所以它开始看起来像:
data class Tweet(var id: String? = null,
var profileId: String? = null,
var message: String? = null)
这是我对Kotlin的第一次体验,所以可能有些东西看起来很难看,但我的主要问题是 - 当我尝试重建使用我的DTO作为依赖项的工件时,我得到了这样的异常:
位于gk.tweetsched.api.repository.TweetRepository的io.vertx.core.json.Json.decodeValue(Json.java:117)的com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992) . get(TweetRepository.java:51)at gk.tweetsched.api.repository.TweetRepositoryTest.testGet(TweetRepositoryTest.java:68)引起:java.lang.ClassNotFoundException:java.net.URLClassLoader中的kotlin.jvm.internal.DefaultConstructorMarker . findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:335)at java.lang.ClassLoader.loadClass(ClassLoader) .java:357)......还有67个
正如我所看到的那样,堆栈跟踪Jackson无法将JSON反序列化为Tweet Kotlin类 .
这是我的Java方法,我得到了这个异常:
public Tweet get(String id) {
try (Jedis jedis = pool.getResource()) {
return Json.decodeValue(jedis.hget(TWEETS_HASH, id), Tweet.class);
} catch (Exception e) {
LOGGER.error(e);
}
return null;
}
其中Json类来自'io.vertx.core.json'包 .
我该如何解决这个问题?我应该在Java项目中使用哪些其他配置来使用Kotlin类?
1 回答
默认情况下,Jackson需要一个无参数构造函数来将JSON反序列化为类--Kotlin数据类没有,所以你需要添加一个Jackson模块来处理这个:
jackson-module-kotlin
编辑:我已经阅读了source for io.vertx.core.json.Json class,似乎该类使用的两个对象映射器都存储在公共静态字段中 .
因此,要注册jackson-module-kotlin,您需要在应用程序初始化代码中包含此代码段(或者在您尝试反序列化任何Kotlin数据类之前,只要它执行的任何地方):