java - 用 Kotlin 数据类替换 Java DTO 类的问题
问题描述
我阅读了有关 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 作为依赖项的工件时,我得到了这样的异常:
在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992) 在 io.vertx.core.json.Json.decodeValue(Json.java:117) 在 gk.tweetsched.api.repository.TweetRepository.get (TweetRepository.java:51) 在 gk.tweetsched.api.repository.TweetRepositoryTest.testGet(TweetRepositoryTest.java:68) 引起:java.lang.ClassNotFoundException: kotlin.jvm.internal.DefaultConstructorMarker at java.net.URLClassLoader.findClass (URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 在 java.lang.ClassLoader.loadClass(ClassLoader. java:357) ... 67 更多
正如我所见,stacktrace 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 类?
解决方案
默认情况下,Jackson 需要一个无参数构造函数来将 JSON 反序列化为一个类 - Kotlin 数据类没有,因此您需要添加一个 Jackson 模块来处理这个:
编辑:我已经阅读了io.vertx.core.json.Json 类的源代码,似乎该类使用的两个对象映射器都存储在公共静态字段中。
因此,要注册jackson-module-kotlin,您需要在应用程序初始化代码中包含此代码段(或者任何其他地方,只要它在您尝试反序列化任何 Kotlin 数据类之前执行):
Json.mapper.registerModule(new KotlinModule())
Json.prettyMapper.registerModule(new KotlinModule())
推荐阅读
- apache - 将 Nginx 重写规则翻译成 Apache
- python - 从 Django 模板中的 DateField 中提取月份
- javascript - 依赖于 Vuetify 的 Vue.js 组件库。$attrs 是只读的 - 错误
- amazon-cloudfront - Cloudfront域名传播后不起作用
- python-3.x - 循环遍历 Pandas Dataframe 并返回列名称和类型
- javascript - 根据用户输入显示最多 12 个时间表
- javascript - 在 react-modal 中更改宽度时将边距添加到 div 元素
- r - 如果我的 IncNodePurity 度量都为 0 意味着什么
- c# - XAML/WPF 绑定到 Page.Resources - 绑定如何流动?
- javascript - 酶按钮模拟未触发 onPress 功能