diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2017-05-02 09:42:22 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2017-05-02 09:42:22 -0700 |
commit | f13cfb1f671af15814e2aa34e9f12cf00ab93b58 (patch) | |
tree | d943f925f0eac76edea547a3e6f6903e5916823c /src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java | |
parent | 56573e135efa4428b52c8374809cae03b39a1dc2 (diff) | |
download | jackson-databind-f13cfb1f671af15814e2aa34e9f12cf00ab93b58.tar.gz |
Improvement wrt #1551: report more appropriate error message for specific case; support other object id methods (alas, can not support property-based on polymorphic via property annotation)
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java | 73 |
1 files changed, 70 insertions, 3 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java index 0342facf9..85153761e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/AbstractDeserializer.java @@ -3,10 +3,17 @@ package com.fasterxml.jackson.databind.deser; import java.io.IOException; import java.util.*; +import com.fasterxml.jackson.annotation.ObjectIdGenerator; +import com.fasterxml.jackson.annotation.ObjectIdGenerators; +import com.fasterxml.jackson.annotation.ObjectIdResolver; + import com.fasterxml.jackson.core.*; + import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.deser.impl.ObjectIdReader; import com.fasterxml.jackson.databind.deser.impl.ReadableObjectId; +import com.fasterxml.jackson.databind.introspect.AnnotatedMember; +import com.fasterxml.jackson.databind.introspect.ObjectIdInfo; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; /** @@ -17,7 +24,8 @@ import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; */ public class AbstractDeserializer extends JsonDeserializer<Object> - implements java.io.Serializable + implements ContextualDeserializer, // since 2.9 + java.io.Serializable { private static final long serialVersionUID = 1L; @@ -33,7 +41,13 @@ public class AbstractDeserializer protected final boolean _acceptBoolean; protected final boolean _acceptInt; protected final boolean _acceptDouble; - + + /* + /********************************************************** + /* Life cycle + /********************************************************** + */ + public AbstractDeserializer(BeanDeserializerBuilder builder, BeanDescription beanDesc, Map<String, SettableBeanProperty> backRefProps) { @@ -58,6 +72,22 @@ public class AbstractDeserializer _acceptInt = (cls == Integer.TYPE) || cls.isAssignableFrom(Integer.class); _acceptDouble = (cls == Double.TYPE) || cls.isAssignableFrom(Double.class); } + + /** + * @since 2.9 + */ + protected AbstractDeserializer(AbstractDeserializer base, + ObjectIdReader objectIdReader) + { + _baseType = base._baseType; + _backRefProperties = base._backRefProperties; + _acceptString = base._acceptString; + _acceptBoolean = base._acceptBoolean; + _acceptInt = base._acceptInt; + _acceptDouble = base._acceptDouble; + + _objectIdReader = objectIdReader; + } /** * Factory method used when constructing instances for non-POJO types, like @@ -68,7 +98,44 @@ public class AbstractDeserializer public static AbstractDeserializer constructForNonPOJO(BeanDescription beanDesc) { return new AbstractDeserializer(beanDesc); } - + + @Override + public JsonDeserializer<?> createContextual(DeserializationContext ctxt, + BeanProperty property) throws JsonMappingException + { + // First: may have an override for Object Id: + final AnnotationIntrospector intr = ctxt.getAnnotationIntrospector(); + final AnnotatedMember accessor = (property == null || intr == null) + ? null : property.getMember(); + if (accessor != null && intr != null) { + ObjectIdInfo objectIdInfo = intr.findObjectIdInfo(accessor); + if (objectIdInfo != null) { // some code duplication here as well (from BeanDeserializerFactory) + // 2.1: allow modifications by "id ref" annotations as well: + objectIdInfo = intr.findObjectReferenceInfo(accessor, objectIdInfo); + + Class<?> implClass = objectIdInfo.getGeneratorType(); + // 02-May-2017, tatu: Alas, properties are NOT available for abstract classes; can not + // support this particular type + if (implClass == ObjectIdGenerators.PropertyGenerator.class) { + ctxt.reportMappingException( +"Invalid Object Id definition for abstract type %s: can not use `PropertyGenerator` on polymorphic types using property annotation", +handledType().getName()); + } + ObjectIdResolver resolver = ctxt.objectIdResolverInstance(accessor, objectIdInfo); + JavaType type = ctxt.constructType(implClass); + JavaType idType = ctxt.getTypeFactory().findTypeParameters(type, ObjectIdGenerator.class)[0]; + SettableBeanProperty idProp = null; + ObjectIdGenerator<?> idGen = ctxt.objectIdGeneratorInstance(accessor, objectIdInfo); + JsonDeserializer<?> deser = ctxt.findRootValueDeserializer(idType); + ObjectIdReader oir = ObjectIdReader.construct(idType, objectIdInfo.getPropertyName(), + idGen, deser, idProp, resolver); + return new AbstractDeserializer(this, oir); + } + } + // either way, need to resolve serializer: + return this; + } + /* /********************************************************** /* Public accessors |