我正在使用 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
如果我像这样完全注释 Session 数据类,它确实有效:
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?当 Session 数据类没有完全注释时,导致解组失败的细微差别是什么?
编辑
不同之处在于我测试了从 Gradle 运行它的 Workflow 测试用例,它使用了不同版本的 Kotlin,然后是我从 IDEA IDE 运行的 Session 测试用例。IDEA 的 Kotlin 插件的更新也更新了 IDEA 用来运行测试用例的 Kotlin 版本,我没有注意到。这导致 Kotlin 和 Jackson-Kotlin 库的版本不匹配。下面接受的答案指出了需要配置什么才能让事情再次运行。