在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 (对于Jackson 2.7.x
    • 版本2.6.5-2 (对于Jackson 2.6.x
    • 版本2.5.5-2 (用于Jackson 2.5.x

    之后这将回到Maven中央。

  • 发送给jackson的实际JSON是什么?

  • 在堆栈跟踪中是来自MongoDB的这个错误,还是Jackson肯定涉及的(在调用Jackson之前是否预处理并确定错误)?
  • MongoDB如何获得它的ObjectMapper,你是如何尝试配置它的?