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

在Kotlin中,为什么Jackson在某些情况下无法解组未注释的对象,而在其他情况下则无法解组

柳修平
2023-03-14

我用Kotlin和Jongo来访问MongoDB。Jongo使用Jackson来序列化/反序列化对象,以便从MongoDB中保存和读取它们。我使用Jackson-Kotlin模块来帮助使用构造函数序列化Kotlin数据类。

下面是一个序列化良好的数据类的示例:

data class Workflow (
    @field:[MongoId MongoObjectId] @param:MongoId
    var id: String? = null,

    val name: String,
    val states: Map<String, State>
)

下面是一个未能反序列化的类似类的示例:

data class Session (
    @field:[MongoObjectId MongoId] @param:MongoId
    var id: String? = null,

    var status: CallStatus,
    var currentState: String,
    var context: MutableMap<String, Any?>,
    val events: MutableMap<String, Event>
)

Jongo抛出以下异常,因为Jackson反序列化失败:

org.jongo.marshall.MarshallingException: Unable to unmarshall result to class example.model.Session from content { "_id" : { "$oid" : "56c4976aceb2503bf3cd92c2"} , "status" : "Ongoing" , "currentState" : "Start" , "context" : { } , "events" : { }}
... bunch of stack trace entries ...
Caused by: java.lang.IllegalArgumentException: Argument #1 of constructor [constructor for example.model.Session, annotations: [null]] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator

如果我像这样完整地注释会话数据类,它确实可以工作:

data class Session (
    @field:[MongoObjectId MongoId] @param:MongoId
    var id: String? = null,

    @JsonProperty("status")
    var status: CallStatus,

    @JsonProperty("currentState")
    var currentState: String,

    @JsonProperty("context")
    var context: MutableMap<String, Any?>,

    @JsonProperty("events")
    val events: MutableMap<String, Event>
}

我的问题是,为什么它适用于Workflow?当会话数据类没有完全注释时,解组失败的微妙区别是什么?

编辑

不同之处在于,我测试了从 Gradle 运行它的工作流测试用例,它使用了不同版本的 Kotlin,然后我从 IDEA IDE 运行的会话测试用例。IDEA的柯特林插件的更新也更新了IDEA用来运行测试用例的柯特林版本,我没有注意到。这导致了科特林和杰克逊-科特林图书馆版本不匹配。下面接受的答案指出了需要配置的内容才能使事情再次工作。

共有1个答案

须曜文
2023-03-14

如果MongoDB使用的ObjectMapper没有注册Jackson-静态编程语言模块,则会出现此错误。您的JsonProperty注释基本上与该模块隐式执行的操作相同。但是如果它不存在,您将收到大约相同的错误消息

看的东西:

>

  • 您有兼容版本的Jackson-静态编程语言模块,与您的静态编程语言代码版本相匹配。对于RC 1050或更高版本,您需要GitHub上的README.MD文件中提到的最新版本的Jackson模块。

    杰克逊-科特林模块的旧版本与柯特林 1.0.0 不兼容。您必须更新,否则将遇到静默失败(模块无法识别 Kotlin 类,因此忽略它)。Kotlin 1.0.0 的版本将很快在 Maven 中心推出。同时使用 EAP 存储库:

    maven {
       url  "http://dl.bintray.com/jaysonminard/kohesive"
    }
    

    对于静态编程语言1.0.0,使用以下之一:

      < li >发布< code>2.7.1-1(适用于Jackson 2.7.x) < li >发布< code>2.6.5-2(适用于Jackson 2.6.x) < li >发布< code>2.5.5-2(适用于Jackson 2.5.x)

    稍后将返回Maven Central。

    发送给杰克逊的实际JSON是什么?

  •  类似资料:
    • 我遇到了一个非常奇怪的问题,java线程正忙着等待。 我有一个线程忙于等待其他线程的静态变量的状态。假设忙碌等待的线程正在等待另一个线程的静态int变量达到某个值 如果我使用上面的代码,线程将被卡在忙等待中,不会跳出while循环,即使确实达到5。 但是,如果我使用其他代码,那么线程确实会跳出忙等待循环。有时,一旦达到5,其他时候会晚一点。但它会发生。对于我的特定示例,我将其用作“无意义的工作”

    • 我目前正在承担一个项目,我正在使用Java微基准线束(JMH)框架测量Java中不同类型循环的速度。我得到了一些关于流的有趣结果,我无法解释,并且想知道是否更了解流和数组列表的人可以帮助我解释我的结果。 基本上,当遍历大小为100的数组列表时,stream.forEach方法比任何其他类型的循环都快得多: 我的结果图表显示在这里:https://i.imgur.com/ypXoWWq.png 我尝

    • 问题内容: 我已经在带有Selenium和PhantomJS的Python中设置了一个简单的webscraping脚本。我总共要抓取大约200个URL。脚本最初运行良好,然后运行了大约20-30个URL(它可能会更多/更少,因为它失败时似乎是随机的,并且与任何特定的URL不相关),我在python中收到以下错误: 还有我的ghostdriver.log: 我进行了搜索,关于SO的大多数问题似乎都是

    • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用

    • 我有以下代码: 当我用java 8运行代码时,它可以工作。但对于java 11,它抛出了一个例外:java。时间总体安排DateTimeParseException:无法在索引3处分析文本“20 Janeiro 2021 00:26”。 我也有类似的情况,我要转换的字符串中有一个区域,代码是: 如果使用java 8运行,它仍然有效,但使用java 11则不行。异常是:java.time.forma

    • 我正在windows(7.3版)上安装gvim。启动后,我希望设置变量MYVIMRC,但它没有设置。有没有理由不设定。 有一个vimrc文件,因为许多设置与默认设置不同。 我用检查了MYVIMRC的值 gvim可执行文件位于c:\workarea\Vim\vim73中,c:\workare\Vim中的*\u vimrc*(在gvim启动时读取)。启动gvim后,我可以使用 对于版本:我发现系统vi