ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用Kotlin Data类替换Java DTO类的问题

2019-09-10 21:01:02  阅读:218  来源: 互联网

标签:dto java kotlin


我读到了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

正如我所看到的那样,堆栈跟踪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,似乎这个类使用的对象映射器都存储在公共静态字段中.

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

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

标签:dto,java,kotlin
来源: https://codeday.me/bug/20190910/1801420.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有