2016-02-17 28 views
1

我正在使用Kotlin和Jongo訪問MongoDB。 Jongo使用Jackson對對象進行序列化/反序列化,以保存並從MongoDB中讀取它們。我使用Jackson-Kotlin模塊來幫助使用構造函數序列化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拋出,因爲傑克遜反序列化失敗:

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 

它確實有效,如果我完全註釋t他會話數據類是這樣的:

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> 
} 

我的問題是,爲什麼它的工作流程?當Session數據類沒有完全註釋時,會導致解組失敗的細微差異是什麼?

EDIT

的區別是,我測試工作流測試情況下,從搖籃,它使用不同版本的科特林然後,我從IDEA IDE運行會話測試用例運行它。更新IDEA的Kotlin插件也更新了IDEA用來運行測試用例的Kotlin版本,我沒有注意到它。這導致了Kotlin和Jackson-Kotlin庫的不匹配版本。下面接受的答案指出需要配置什麼才能讓事情再次運行。

+0

你不包括對傑克遜物體映射器的調用,你能表明一下嗎? –

+0

並注意你的'_id'字段和'id'不一樣嗎? –

+0

有什麼方法可以報告mongodb發送給Jackson的反序列化JSON?它不能是錯誤消息中的JSON,因此它們必須稍微修改它。 –

回答

2

如果MongoDB使用的是沒有註冊Jackson-Kotlin模塊的ObjectMapper,則會出現此錯誤。您的JsonProperty註釋基本上與模塊隱式執行的操作相同。但是,如果它不存在,您將收到大約相同的錯誤消息。

事情來看待:

  • 你有傑克遜科特林模塊符合您的科特林代碼版本的兼容版本。對於RC 1050或更新版本,您需要提供README.MD file on GitHub中提及的傑克遜模塊的最新版本。

    較舊版本的Jackson-Kotlin模塊與Kotlin 1.0.0不兼容。您必須更新,否則您將無聲失敗(模塊無法識別Kotlin類,因此忽略它)。不久之後,Maven Central將發佈Kotlin 1.0.0。在此期間使用EAP存儲庫:

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

    對於Kotlin 1.0。0時,使用的一個:

    • 釋放2.7.1-1(傑克遜2.7.x
    • 釋放2.6.5-2(傑克遜2.6.x
    • 釋放2.5.5-2(傑克遜2.5.x

    後來這將回遷到Maven Central。

  • 什麼實際的JSON發送到傑克遜

  • 是MongoDB的這個錯誤的堆棧跟蹤,或者是涉及傑克遜肯定(做了預處理,並確定調用傑克遜之前的錯誤)?
  • MongoDB是如何獲得它的ObjectMapper的,你是如何嘗試配置它的?
+0

問題在於,IDEA的更新增加了Kotlin版本,並且從IDE運行,其中與Kotlin版本運行的版本不匹配形式爲Jackson-Kotlin。 Jayson回答中的第1點解決了問題。 –

相關問題