Skip to content

Commit a1404d5

Browse files
committed
Fix #1804
1 parent 4675896 commit a1404d5

File tree

5 files changed

+64
-15
lines changed

5 files changed

+64
-15
lines changed

release-notes/VERSION

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ Project: jackson-databind
1010
(reported by nhtzr@github)
1111
#1768: Improve `TypeFactory.constructFromCanonical()` to work with
1212
`java.lang.reflect.Type.getTypeName()` format
13-
13+
#1804: `ValueInstantiator.canInstantiate()` ignores `canCreateUsingArrayDelegate()`
14+
(reported byb henryptung@github)
1415

1516
2.8.10 (24-Aug-2017)
1617

src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java

-3
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,6 @@ public JsonDeserializer<Object> buildBeanDeserializer(DeserializationContext ctx
281281
}
282282
JsonDeserializer<?> deserializer;
283283

284-
/* 19-Mar-2012, tatu: This check used to be done earlier; but we have to defer
285-
* it a bit to collect information on ObjectIdReader, for example.
286-
*/
287284
if (type.isAbstract() && !valueInstantiator.canInstantiate()) {
288285
deserializer = builder.buildAbstract();
289286
} else {

src/main/java/com/fasterxml/jackson/databind/deser/ValueInstantiator.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ public String getValueTypeDesc() {
6868
* be created.
6969
*/
7070
public boolean canInstantiate() {
71-
return canCreateUsingDefault() || canCreateUsingDelegate()
72-
|| canCreateFromObjectWith() || canCreateFromString()
73-
|| canCreateFromInt() || canCreateFromLong()
74-
|| canCreateFromDouble() || canCreateFromBoolean();
75-
}
71+
return canCreateUsingDefault()
72+
|| canCreateUsingDelegate() || canCreateUsingArrayDelegate()
73+
|| canCreateFromObjectWith() || canCreateFromString()
74+
|| canCreateFromInt() || canCreateFromLong()
75+
|| canCreateFromDouble() || canCreateFromBoolean();
76+
}
7677

7778
/**
7879
* Method that can be called to check whether a String-based creator

src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java

+15-6
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public String getValueTypeDesc() {
183183
public Class<?> getValueClass() {
184184
return _valueClass;
185185
}
186-
186+
187187
@Override
188188
public boolean canCreateFromString() {
189189
return (_fromStringCreator != null);
@@ -208,27 +208,36 @@ public boolean canCreateFromDouble() {
208208
public boolean canCreateFromBoolean() {
209209
return (_fromBooleanCreator != null);
210210
}
211-
211+
212212
@Override
213213
public boolean canCreateUsingDefault() {
214214
return (_defaultCreator != null);
215215
}
216216

217217
@Override
218218
public boolean canCreateUsingDelegate() {
219-
return _delegateType != null;
219+
return (_delegateType != null);
220220
}
221221

222222
@Override
223223
public boolean canCreateUsingArrayDelegate() {
224-
return _arrayDelegateType != null;
224+
return (_arrayDelegateType != null);
225225
}
226-
226+
227227
@Override
228228
public boolean canCreateFromObjectWith() {
229229
return (_withArgsCreator != null);
230230
}
231231

232+
@Override
233+
public boolean canInstantiate() {
234+
return canCreateUsingDefault()
235+
|| canCreateUsingDelegate() || canCreateUsingArrayDelegate()
236+
|| canCreateFromObjectWith() || canCreateFromString()
237+
|| canCreateFromInt() || canCreateFromLong()
238+
|| canCreateFromDouble() || canCreateFromBoolean();
239+
}
240+
232241
@Override
233242
public JavaType getDelegateType(DeserializationConfig config) {
234243
return _delegateType;
@@ -263,7 +272,7 @@ public Object createUsingDefault(DeserializationContext ctxt) throws IOException
263272
null, rewrapCtorProblem(ctxt, t));
264273
}
265274
}
266-
275+
267276
@Override
268277
public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException
269278
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.fasterxml.jackson.databind.creators;
2+
3+
import java.util.List;
4+
5+
import com.fasterxml.jackson.annotation.JsonCreator;
6+
import com.fasterxml.jackson.annotation.JsonValue;
7+
import com.fasterxml.jackson.databind.BaseMapTest;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
10+
public class DelegatingArrayCreator1804Test extends BaseMapTest
11+
{
12+
public static class MyTypeImpl extends MyType {
13+
private final List<Integer> values;
14+
15+
MyTypeImpl(List<Integer> values) {
16+
this.values = values;
17+
}
18+
19+
@Override
20+
public List<Integer> getValues() {
21+
return values;
22+
}
23+
}
24+
25+
static abstract class MyType {
26+
@JsonValue
27+
public abstract List<Integer> getValues();
28+
29+
@JsonCreator(mode=JsonCreator.Mode.DELEGATING)
30+
public static MyType of(List<Integer> values) {
31+
return new MyTypeImpl(values);
32+
}
33+
}
34+
35+
36+
public void testDelegatingArray1804() throws Exception {
37+
ObjectMapper mapper = new ObjectMapper();
38+
MyType thing = mapper.readValue("[]", MyType.class);
39+
assertNotNull(thing);
40+
}
41+
}

0 commit comments

Comments
 (0)