在Kotlin中,为什么jackson在某些情况下未能解组未注释的对象,而不是在其他情况下
我使用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 )
下面是一个不能反序列化的类的例子:
data class Session ( @field:[MongoObjectId MongoId] @param:MongoId var id: String? = null, var status: CallStatus, var currentState: String, var context: MutableMap, val events: MutableMap )
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, @JsonProperty("events") val events: MutableMap }
我的问题是,为什么它工作流程? 当Session数据类没有完全注释时,解组失败的细微差别是什么?
编辑
不同的是,我测试了从Gradle运行的Workflow测试用例,它使用了不同版本的Kotlin,然后是从IDEA IDE运行的Session测试用例。 IDEA的Kotlin插件的更新也更新了IDEA用来运行测试用例的Kotlin版本,我没有注意到。 这导致了Kotlin和Jackson-Kotlin库的不匹配版本。 下面接受的答案指出需要配置什么才能使事情重新工作。
如果MongoDB正在使用没有注册Jackson-Kotlin模块的ObjectMapper
,你会得到这个错误。 你的JsonProperty
注释基本上和模块隐含的一样。 但是,如果它不存在,你会收到大约相同的错误信息。
事情看:
-
您拥有与您的Kotlin代码版本相匹配的兼容版本的Jackson-Kotlin模块。 对于RC 1050或更新版本,您需要GitHub上的README.MD文件中提到的最新版本的Jackson模块。
较早版本的Jackson-Kotlin模块与Kotlin 1.0.0不兼容。 您必须更新,否则您将无声失败(模块无法识别Kotlin类,因此忽略它)。 Kotlin 1.0.0的发布不久将在Maven Central上发布。 同时使用EAP存储库:
maven { url "http://dl.bintray.com/jaysonminard/kohesive" }
对于Kotlin 1.0.0,请使用以下之一:
- 版本
2.7.1-1
(对于Jackson2.7.x
) - 版本
2.6.5-2
(对于Jackson2.6.x
) - 版本
2.5.5-2
(用于Jackson2.5.x
)
之后这将回到Maven中央。
- 版本
-
发送给jackson的实际JSON是什么?
- 在堆栈跟踪中是来自MongoDB的这个错误,还是Jackson肯定涉及的(在调用Jackson之前是否预处理并确定错误)?
- MongoDB如何获得它的ObjectMapper,你是如何尝试配置它的?