java - 用 Kotlin 数据类替换 Java DTO 类的问题

标签 java kotlin 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 作为依赖项的工件时,我得到了这样的异常:

at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992) at io.vertx.core.json.Json.decodeValue(Json.java:117) at gk.tweetsched.api.repository.TweetRepository.get(TweetRepository.java:51) at gk.tweetsched.api.repository.TweetRepositoryTest.testGet(TweetRepositoryTest.java:68) Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.DefaultConstructorMarker at java.net.URLClassLoader.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 more

据我所见,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 模块来处理这个:

jackson-module-kotlin

编辑: 我读过 source for io.vertx.core.json.Json class并且似乎该类使用的两个对象映射器都存储在公共(public)静态字段中。

所以注册jackson-module-kotlin你需要在你的应用程序初始化代码中包含这个片段(或者任何其他地方,只要它在你尝试反序列化任何 Kotlin 数据类之前执行):

Json.mapper.registerModule(new KotlinModule())
Json.prettyMapper.registerModule(new KotlinModule()) 

关于java - 用 Kotlin 数据类替换 Java DTO 类的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51020722/

相关文章:

java - 关于 SimpleDB 查询

android - 自定义 View 上的双向数据绑定(bind)自定义属性

模块之间的Android View 绑定(bind)

java - Java 中的 Kotlin 内部类公开可见

java - 使用 hibernate 时的 DAO 模式

java - 再次出现空指针异常

java - 如何使用 Spring CrudRepository 查询 boolean 属性?

java - Java 中的 HTTP 多部分类

spring-boot - Spring 启动数据@query到DTO

GWT + 实体 + JPA + DTO + 推土机