Skip to content

Commit 568005d

Browse files
committed
minor improvement to allow map-from-array delegating creator (no test, should have)
1 parent 3edb591 commit 568005d

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -204,18 +204,28 @@ public void setIgnorableProperties(Set<String> ignorable) {
204204
public void resolve(DeserializationContext ctxt) throws JsonMappingException
205205
{
206206
// May need to resolve types for delegate- and/or property-based creators:
207-
if (_valueInstantiator.canCreateUsingDelegate()) {
208-
JavaType delegateType = _valueInstantiator.getDelegateType(ctxt.getConfig());
209-
if (delegateType == null) {
210-
throw new IllegalArgumentException("Invalid delegate-creator definition for "+_mapType
211-
+": value instantiator ("+_valueInstantiator.getClass().getName()
212-
+") returned true for 'canCreateUsingDelegate()', but null for 'getDelegateType()'");
207+
if (_valueInstantiator != null) {
208+
if (_valueInstantiator.canCreateUsingDelegate()) {
209+
JavaType delegateType = _valueInstantiator.getDelegateType(ctxt.getConfig());
210+
if (delegateType == null) {
211+
throw new IllegalArgumentException("Invalid delegate-creator definition for "+_mapType
212+
+": value instantiator ("+_valueInstantiator.getClass().getName()
213+
+") returned true for 'canCreateUsingDelegate()', but null for 'getDelegateType()'");
214+
}
215+
/* Theoretically should be able to get CreatorProperty for delegate
216+
* parameter to pass; but things get tricky because DelegateCreator
217+
* may contain injectable values. So, for now, let's pass nothing.
218+
*/
219+
_delegateDeserializer = findDeserializer(ctxt, delegateType, null);
220+
} else if (_valueInstantiator.canCreateUsingArrayDelegate()) {
221+
JavaType delegateType = _valueInstantiator.getArrayDelegateType(ctxt.getConfig());
222+
if (delegateType == null) {
223+
throw new IllegalArgumentException("Invalid delegate-creator definition for "+_mapType
224+
+": value instantiator ("+_valueInstantiator.getClass().getName()
225+
+") returned true for 'canCreateUsingDelegate()', but null for 'getArrayDelegateType()'");
226+
}
227+
_delegateDeserializer = findDeserializer(ctxt, delegateType, null);
213228
}
214-
/* Theoretically should be able to get CreatorProperty for delegate
215-
* parameter to pass; but things get tricky because DelegateCreator
216-
* may contain injectable values. So, for now, let's pass nothing.
217-
*/
218-
_delegateDeserializer = findDeserializer(ctxt, delegateType, null);
219229
}
220230
if (_valueInstantiator.canCreateFromObjectWith()) {
221231
SettableBeanProperty[] creatorProps = _valueInstantiator.getFromObjectArguments(ctxt.getConfig());

src/test/java/com/fasterxml/jackson/databind/creators/ArrayDelegatorCreatorForCollectionTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.fasterxml.jackson.databind.*;
99

10+
// for [databind#1392] (regression in 2.7 due to separation of array-delegating creator)
1011
public class ArrayDelegatorCreatorForCollectionTest extends BaseMapTest
1112
{
1213
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)

0 commit comments

Comments
 (0)