当前位置: 首页 > 知识库问答 >
问题:

用静态编程语言数据类替换JavaDTO类的问题

柴嘉年
2023-03-14

我读过关于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)

这是我第一次使用静态编程语言,所以可能有些东西看起来很难看,但我的主要问题是——当我试图重建使用我的DTO作为依赖的工件时,我会遇到这样的异常:

在com。fasterxml。杰克逊。数据绑定。对象映射器。io上的readValue(ObjectMapper.java:2992)。维特斯。果心json。Json。在gk处解码值(Json.java:117)。tweetsched。应用程序编程接口。存储库。TweetRepository。在gk获取(TweetRepository.java:51)。tweetsched。应用程序编程接口。存储库。TweetRepositoryTest。testGet(TweetRepositoryTest.java:68)由:java引起。lang.ClassNotFoundException:kotlin。jvm。内部的java上的DefaultConstructorMarker。网URLClassLoader。java上的findClass(URLClassLoader.java:381)。lang.ClassLoader。sun上的loadClass(ClassLoader.java:424)。杂项。启动器$AppClassLoader。java上的loadClass(Launcher.java:335)。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”。维特斯。果心json’包。

我如何解决这个问题?我应该在Java项目中进行哪些额外的配置来使用Kotlin类?

共有2个答案

华季萌
2023-03-14

在我的例子中,我在java中创建了kotlin类DTO实例,用于使用RESTful Api。现在,我测试了两种解决方案:

  1. 在数据类中使用无参数构造函数

参考文献kotlin说:

在JVM上,如果主构造函数的所有参数都有默认值,编译器将生成一个额外的无参数构造函数,该构造函数将使用默认值。这使得将Kotlin与通过无参数构造函数创建类实例的库(如Jackson或JPA)一起使用更加容易。

我在kotlin有一个DTO,像这样:

    data class Dto (
        var id: Int?=null,
        var version: Int?=null, 
        var title: String?=null,
        var firstname: String?=null,
        var lastname: String?=null,
        var birthdate: String?=null

)

然后,我用java创建类实例DTO:

Dto dto = new Dto();
dto.setId(javadto.getId());
...

导入com。fasterxml。杰克逊。注释。JsonProperty

    data class Dto (
            @JsonProperty("id") var id: Int?,
            @JsonProperty("version") var version: Int?, 
            @JsonProperty("title") var title: String?,
            @JsonProperty("firstname") var firstname: String?,
            @JsonProperty("lastname") var lastname: String?,
            @JsonProperty("birthdate") var birthdate: String?,

    )

然后,我用java创建类实例DTO:

Dto dto = new Dto(null, null, null, null, null, null);
dto.setId(javadto.getId());
...
吕博耘
2023-03-14

默认情况下,Jackson需要一个无参数构造函数来反序列化JSON到一个类-静态编程语言数据类没有一个,所以你需要添加一个Jackson模块来处理这个:

杰克逊模块

编辑:我已经阅读了io的源代码。维特斯。果心json。类使用的两个对象映射器似乎都存储在公共静态字段中。

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

Json.mapper.registerModule(new KotlinModule())
Json.prettyMapper.registerModule(new KotlinModule()) 
 类似资料:
  • 到目前为止,我一直在使用这个静态编程语言密封类: 这在我的Kotlin和Java代码中都非常有效。今天我尝试将这个类改为使用对象(建议减少额外的类实例化): 我可以在我的其他静态编程语言文件中引用这个简单的版本,但是我现在正在努力在我的Java文件中使用它。 当我尝试在Java中引用时,我尝试了以下两种回弹编译错误: 有人知道我现在如何在Java中引用该实例吗?

  • 本文向大家介绍动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍,包括了动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍的使用技巧和注意事项,需要的朋友参考一下 关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象。 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 是否有可能在Kotlin 属性初始化之前从其获取< code>::class.java? 从逻辑上讲,它应该可以工作——我试图获取一个类而不是一个值,但实际上它在未初始化的属性访问异常时失败。 请注意,我试图获取类的属性位于泛型类中,其类型是泛型参数之一: 我需要这个类来创建的实例 当然,我不能做到: 对此有什么解决办法吗?

  • 我正在Kotlin进行大师/细节流程活动。我有碎片不匹配的问题,因为在一个活动中我需要Android。支持v4.app。Fragment和其他android。应用程序。碎片我实现了自己的细节片段,并继承了Android系统。支持v4.app。用于修复ListActivity中supportFragmnet事务中不匹配的片段 但是,我在DetailActivity中的fragmentManager中

  • 如何为方法/类生成注释?只需输入: 推入似乎在IntelliJ IDEA 2016.1.3中不起作用 看起来Dokka已经取代了KDoc,但为什么IntelliJ中没有支持?还是我错过了什么? 澄清:当输入/**enter时,会生成: 但是我想知道为什么没有添加@参数和其他的生成(就像IntelliJ为Java所做的那样)。这些注释也用于记录静态编程语言代码(https://kotlinlang.