我正在使用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庫的不匹配版本。下面接受的答案指出需要配置什麼才能讓事情再次運行。
你不包括對傑克遜物體映射器的調用,你能表明一下嗎? –
並注意你的'_id'字段和'id'不一樣嗎? –
有什麼方法可以報告mongodb發送給Jackson的反序列化JSON?它不能是錯誤消息中的JSON,因此它們必須稍微修改它。 –