Details
-
Type:
Bug
-
Status:
Resolved
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 2.0.0
-
Fix Version/s: 2.0.0
-
Component/s: Deserializer
-
Labels:None
-
Environment:2.0.0-RC2 and 2.0.0-RC3-SNAPSHOT
-
Testcase included:yes
-
Number of attachments :
Description
I have some troubles with an object graph that keeps parent-child relationships and uses type inheritance. I simplified my object model to a (hopefully) minimal example that exposes the problem. Serializing works fine, but deserializing fails with the following stacktrace:
com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (VALUE_NUMBER_INT), expected FIELD_NAME: missing property '@class' that is to contain type id (for class JacksonPolyGraph$Activity) at [Source: java.io.StringReader@ccadbd; line: 18, column: 18] (through reference chain: FaultHandler["owner"]->Process["children"]->Catch["parent"]) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:163) at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:641) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedUsingDefaultImpl(AsPropertyTypeDeserializer.java:138) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:71) at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:49) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336) at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:87) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:224) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:110) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:80) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:767) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:228) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:203) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23) at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:109) at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:55) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:241) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336) at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:87) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:224) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:110) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:80) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:767) at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:336) at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:87) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:224) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:133) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:110) at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:80) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:767) at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:36) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2563) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1805) at JacksonPolyGraph.testGraphWithInheritance(JacksonPolyGraph.java:37)
This is the JSON output:
{
"@class" : "JacksonPolyGraph$Process",
"id" : 0,
"owner" : null,
"childIdCounter" : 3,
"children" : [ "java.util.ArrayList", [ {
"@class" : "JacksonPolyGraph$Scope",
"id" : 1,
"owner" : 0,
"parent" : null,
"faultHandlers" : [ "java.util.ArrayList", [ {
"@class" : "JacksonPolyGraph$FaultHandler",
"id" : 2,
"owner" : 0,
"catchBlocks" : [ "java.util.ArrayList", [ {
"@class" : "JacksonPolyGraph$Catch",
"id" : 3,
"owner" : 0,
"parent" : 1,
"faultHandlers" : [ "java.util.ArrayList", [ ] ]
} ] ]
} ] ]
}, 2, 3 ] ]
}
Hm, just stumbled upon
JACKSON-368. They are probably related, when I make the abstract class concrete, it works flawlessly. What is IMO different toJACKSON-368is the fact that the type information is not really needed, since it the instance is already there and only needs to be looked up using its ID.