diff --git a/release-notes/VERSION b/release-notes/VERSION index a2f59c9c30..86051acdc4 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -10,7 +10,8 @@ Project: jackson-databind (reported by nhtzr@github) #1768: Improve `TypeFactory.constructFromCanonical()` to work with `java.lang.reflect.Type.getTypeName()` format - +#1804: `ValueInstantiator.canInstantiate()` ignores `canCreateUsingArrayDelegate()` + (reported byb henryptung@github) 2.8.10 (24-Aug-2017) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java index 9301c666a8..aa9d393278 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -281,9 +281,6 @@ public JsonDeserializer buildBeanDeserializer(DeserializationContext ctx } JsonDeserializer deserializer; - /* 19-Mar-2012, tatu: This check used to be done earlier; but we have to defer - * it a bit to collect information on ObjectIdReader, for example. - */ if (type.isAbstract() && !valueInstantiator.canInstantiate()) { deserializer = builder.buildAbstract(); } else { diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/ValueInstantiator.java b/src/main/java/com/fasterxml/jackson/databind/deser/ValueInstantiator.java index dfc62cf24e..fceac96e9a 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/ValueInstantiator.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/ValueInstantiator.java @@ -68,11 +68,12 @@ public String getValueTypeDesc() { * be created. */ public boolean canInstantiate() { - return canCreateUsingDefault() || canCreateUsingDelegate() - || canCreateFromObjectWith() || canCreateFromString() - || canCreateFromInt() || canCreateFromLong() - || canCreateFromDouble() || canCreateFromBoolean(); - } + return canCreateUsingDefault() + || canCreateUsingDelegate() || canCreateUsingArrayDelegate() + || canCreateFromObjectWith() || canCreateFromString() + || canCreateFromInt() || canCreateFromLong() + || canCreateFromDouble() || canCreateFromBoolean(); + } /** * Method that can be called to check whether a String-based creator diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java index 94b5831bfb..97057703ac 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java @@ -183,7 +183,7 @@ public String getValueTypeDesc() { public Class getValueClass() { return _valueClass; } - + @Override public boolean canCreateFromString() { return (_fromStringCreator != null); @@ -208,7 +208,7 @@ public boolean canCreateFromDouble() { public boolean canCreateFromBoolean() { return (_fromBooleanCreator != null); } - + @Override public boolean canCreateUsingDefault() { return (_defaultCreator != null); @@ -216,19 +216,28 @@ public boolean canCreateUsingDefault() { @Override public boolean canCreateUsingDelegate() { - return _delegateType != null; + return (_delegateType != null); } @Override public boolean canCreateUsingArrayDelegate() { - return _arrayDelegateType != null; + return (_arrayDelegateType != null); } - + @Override public boolean canCreateFromObjectWith() { return (_withArgsCreator != null); } + @Override + public boolean canInstantiate() { + return canCreateUsingDefault() + || canCreateUsingDelegate() || canCreateUsingArrayDelegate() + || canCreateFromObjectWith() || canCreateFromString() + || canCreateFromInt() || canCreateFromLong() + || canCreateFromDouble() || canCreateFromBoolean(); + } + @Override public JavaType getDelegateType(DeserializationConfig config) { return _delegateType; @@ -263,7 +272,7 @@ public Object createUsingDefault(DeserializationContext ctxt) throws IOException null, rewrapCtorProblem(ctxt, t)); } } - + @Override public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException { diff --git a/src/test/java/com/fasterxml/jackson/databind/creators/DelegatingArrayCreator1804Test.java b/src/test/java/com/fasterxml/jackson/databind/creators/DelegatingArrayCreator1804Test.java new file mode 100644 index 0000000000..328f4bc4f3 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/creators/DelegatingArrayCreator1804Test.java @@ -0,0 +1,41 @@ +package com.fasterxml.jackson.databind.creators; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.fasterxml.jackson.databind.BaseMapTest; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DelegatingArrayCreator1804Test extends BaseMapTest +{ + public static class MyTypeImpl extends MyType { + private final List values; + + MyTypeImpl(List values) { + this.values = values; + } + + @Override + public List getValues() { + return values; + } + } + + static abstract class MyType { + @JsonValue + public abstract List getValues(); + + @JsonCreator(mode=JsonCreator.Mode.DELEGATING) + public static MyType of(List values) { + return new MyTypeImpl(values); + } + } + + + public void testDelegatingArray1804() throws Exception { + ObjectMapper mapper = new ObjectMapper(); + MyType thing = mapper.readValue("[]", MyType.class); + assertNotNull(thing); + } +}