@@ -77,6 +77,12 @@ public abstract class BeanDeserializerBase
77
77
* to be used for deserializing from JSON Object.
78
78
*/
79
79
protected JsonDeserializer <Object > _delegateDeserializer ;
80
+
81
+ /**
82
+ * Deserializer that is used iff array-delegate-based creator
83
+ * is to be used for deserializing from JSON Object.
84
+ */
85
+ protected JsonDeserializer <Object > _arrayDelegateDeserializer ;
80
86
81
87
/**
82
88
* If the bean needs to be instantiated using constructor
@@ -526,22 +532,20 @@ public void resolve(DeserializationContext ctxt)
526
532
+": value instantiator (" +_valueInstantiator .getClass ().getName ()
527
533
+") returned true for 'canCreateUsingDelegate()', but null for 'getDelegateType()'" );
528
534
}
529
- AnnotatedWithParams delegateCreator = _valueInstantiator .getDelegateCreator ();
530
- // Need to create a temporary property to allow contextual deserializers:
531
- BeanProperty .Std property = new BeanProperty .Std (TEMP_PROPERTY_NAME ,
532
- delegateType , null , _classAnnotations , delegateCreator ,
533
- PropertyMetadata .STD_OPTIONAL );
534
-
535
- TypeDeserializer td = delegateType .getTypeHandler ();
536
- if (td == null ) {
537
- td = ctxt .getConfig ().findTypeDeserializer (delegateType );
538
- }
539
- JsonDeserializer <Object > dd = findDeserializer (ctxt , delegateType , property );
540
- if (td != null ) {
541
- td = td .forProperty (property );
542
- dd = new TypeWrappedDeserializer (td , dd );
535
+ _delegateDeserializer = _findDelegateDeserializer (ctxt , delegateType ,
536
+ _valueInstantiator .getDelegateCreator ());
537
+ }
538
+
539
+ // and array-delegate-based constructor:
540
+ if (_valueInstantiator .canCreateUsingArrayDelegate ()) {
541
+ JavaType delegateType = _valueInstantiator .getArrayDelegateType (ctxt .getConfig ());
542
+ if (delegateType == null ) {
543
+ throw new IllegalArgumentException ("Invalid array-delegate-creator definition for " +_beanType
544
+ +": value instantiator (" +_valueInstantiator .getClass ().getName ()
545
+ +") returned true for 'canCreateUsingArrayDelegate()', but null for 'getArrayDelegateType()'" );
543
546
}
544
- _delegateDeserializer = dd ;
547
+ _arrayDelegateDeserializer = _findDelegateDeserializer (ctxt , delegateType ,
548
+ _valueInstantiator .getArrayDelegateCreator ());
545
549
}
546
550
547
551
// And now that we know CreatorProperty instances are also resolved can finally create the creator:
@@ -564,6 +568,26 @@ public void resolve(DeserializationContext ctxt)
564
568
_vanillaProcessing = _vanillaProcessing && !_nonStandardCreation ;
565
569
}
566
570
571
+ private JsonDeserializer <Object > _findDelegateDeserializer (DeserializationContext ctxt , JavaType delegateType ,
572
+ AnnotatedWithParams delegateCreator ) throws JsonMappingException {
573
+ // Need to create a temporary property to allow contextual deserializers:
574
+ BeanProperty .Std property = new BeanProperty .Std (TEMP_PROPERTY_NAME ,
575
+ delegateType , null , _classAnnotations , delegateCreator ,
576
+ PropertyMetadata .STD_OPTIONAL );
577
+
578
+ TypeDeserializer td = delegateType .getTypeHandler ();
579
+ if (td == null ) {
580
+ td = ctxt .getConfig ().findTypeDeserializer (delegateType );
581
+ }
582
+ JsonDeserializer <Object > dd = findDeserializer (ctxt , delegateType , property );
583
+ if (td != null ) {
584
+ td = td .forProperty (property );
585
+ return new TypeWrappedDeserializer (td , dd );
586
+ }
587
+ return dd ;
588
+ }
589
+
590
+
567
591
/**
568
592
* Helper method that can be used to see if specified property is annotated
569
593
* to indicate use of a converter for property value (in case of container types,
@@ -1223,6 +1247,18 @@ public Object deserializeFromBoolean(JsonParser p, DeserializationContext ctxt)
1223
1247
1224
1248
public Object deserializeFromArray (JsonParser p , DeserializationContext ctxt ) throws IOException
1225
1249
{
1250
+ if (_arrayDelegateDeserializer != null ) {
1251
+ try {
1252
+ Object bean = _valueInstantiator .createUsingArrayDelegate (ctxt , _arrayDelegateDeserializer .deserialize (p , ctxt ));
1253
+ if (_injectables != null ) {
1254
+ injectValues (ctxt , bean );
1255
+ }
1256
+ return bean ;
1257
+ } catch (Exception e ) {
1258
+ wrapInstantiationProblem (e , ctxt );
1259
+ }
1260
+ }
1261
+ // fallback to non-array delegate
1226
1262
if (_delegateDeserializer != null ) {
1227
1263
try {
1228
1264
Object bean = _valueInstantiator .createUsingArrayDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
0 commit comments