En Kotlin, por qué Jackson falla al desmantelar el object no anotado en algunos casos y no en otros

Estoy usando Kotlin con Jongo para acceder a MongoDB. Jongo usa Jackson para serializar / deserializar objects para savelos y leerlos de MongoDB. Utilizo el module Jackson-Kotlin para ayudar a serializar las classs de datos de Kotlin usando constructores.

Aquí hay un ejemplo de una class de datos que serializa muy bien:

data class Workflow ( @field:[MongoId MongoObjectId] @param:MongoId var id: String? = null, val name: String, val states: Map<String, State> ) 

Aquí hay un ejemplo de una class similar que no se deserializa:

 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 arroja la siguiente exception porque la deserialization de Jackson falla:

 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 

Funciona si anoto completamente la class de datos de session como esta:

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

Mi pregunta es, ¿por qué funciona para Workflow? ¿Cuál es la diferencia sutil que hace que el desemparejamiento falle para la class de datos de session, cuando no está completamente anotado?

EDITAR

La diferencia fue que probé el caso de testing de Workflow ejecutándolo desde Gradle, que usó versiones diferentes de Kotlin y luego el caso de testing Session que ejecuté desde IDEA IDE. La actualización del complemento Kotlin de IDEA también actualizó la versión de Kotlin que IDEA utiliza para ejecutar casos de testing, que no noté. Esto dio lugar a versiones no coincidentes de la biblioteca de Kotlin y Jackson-Kotlin. La respuesta aceptada a continuación señaló qué se debe configurar para que las cosas funcionen nuevamente.

Obtendrá este error si MongoDB está utilizando un ObjectMapper que no tiene registrado el module Jackson-Kotlin. Sus annotations de JsonProperty básicamente hacen lo mismo que lo que el module hace implícitamente. Pero si no está presente, recibirá aproximadamente el mismo post de error.

Cosas a mirar:

  • Tienes una versión compatible del module Jackson-Kotlin que coincide con tu versión del código de Kotlin. Para RC 1050 o posterior, necesita las últimas versiones del module Jackson mencionadas en el file README.MD en GitHub .

    Las versiones anteriores del module Jackson-Kotlin no son compatibles con Kotlin 1.0.0. Debe actualizar o tendrá fallas silenciosas (el module no puede reconocer una class Kotlin, por lo tanto, la ignora). Las versiones de Kotlin 1.0.0 estarán disponibles próximamente en Maven Central. Mientras tanto, use el repository de EAP:

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

    Para Kotlin 1.0.0, use uno de:

    • lanzamiento 2.7.1-1 (para Jackson 2.7.x )
    • lanzamiento 2.6.5-2 (para Jackson 2.6.x )
    • lanzamiento 2.5.5-2 (para Jackson 2.5.x )

    Más tarde, esto se trasladará a Maven Central.

  • ¿Cuál es el JSON real que se envía a Jackson

  • ¿este error es de MongoDB en stacktrace, o Jackson está seguro (preprocesó y determinó un error antes de llamar a Jackson)?
  • ¿Cómo consigue MongoDB su ObjectMapper y cómo intentó configurar eso?