Unable to find the (Map) Key descriptor for type [simple type, class java.lang.Class <java.lang.Object>]
I used Jackson for serialization Map<Class<?>, BaseClass>
. There are several subclasses BaseClass
, and each one is annotated appropriately for serializing / deserializing Jackson.
- Can an
ObjectMapper.readValue(file, Subclass.class)
instance be called and returnedSubclass
? - If so, how can I avoid this exception?
com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class java.lang.Class<java.lang.Object>]
at com.fasterxml.jackson.databind.deser.DeserializerCache._handleUnknownKeyDeserializer(DeserializerCache.java:578)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findKeyDeserializer(DeserializerCache.java:168)
at com.fasterxml.jackson.databind.DeserializationContext.findKeyDeserializer(DeserializationContext.java:404)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.createContextual(MapDeserializer.java:231)
at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:581)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:369)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:842)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:514)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:292)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:241)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:381)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3154)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3047)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2100)
- Doesn't Jackson know how to deserialize
Class<?>
since this is the underlying JDK type?
UPDATE . I found this StackOverflow question discussing how to implement Polymorphism in Jackson. This answers question # 1, but leaves us with questions # 2 and # 3.
UPDATE2 : Interesting. I found ClassSerializer.java but there is no corresponding one ClassDeserializer.java
in https://github.com/FasterXML/jackson-databind/tree/master/src/main/java/com/fasterxml/jackson/databind/deser/std
UPDATE3 : Bug posted: https://github.com/FasterXML/jackson-databind/issues/630
source to share
This is a known bug and should be fixed in 2.5.0: https://github.com/FasterXML/jackson-databind/issues/630
source to share