@@ -1189,9 +1189,10 @@ protected Object deserializeFromObjectId(JsonParser p, DeserializationContext ct
1189
1189
protected Object deserializeFromObjectUsingNonDefault (JsonParser p ,
1190
1190
DeserializationContext ctxt ) throws IOException
1191
1191
{
1192
- if (_delegateDeserializer != null ) {
1192
+ final JsonDeserializer <Object > delegateDeser = _delegateDeserializer ();
1193
+ if (delegateDeser != null ) {
1193
1194
return _valueInstantiator .createUsingDelegate (ctxt ,
1194
- _delegateDeserializer .deserialize (p , ctxt ));
1195
+ delegateDeser .deserialize (p , ctxt ));
1195
1196
}
1196
1197
if (_propertyBasedCreator != null ) {
1197
1198
return _deserializeUsingPropertyBased (p , ctxt );
@@ -1210,19 +1211,20 @@ protected abstract Object _deserializeUsingPropertyBased(final JsonParser p,
1210
1211
throws IOException , JsonProcessingException ;
1211
1212
1212
1213
@ SuppressWarnings ("incomplete-switch" )
1213
- public Object deserializeFromNumber (JsonParser p , DeserializationContext ctxt ) throws IOException
1214
+ public Object deserializeFromNumber (JsonParser p , DeserializationContext ctxt )
1215
+ throws IOException
1214
1216
{
1215
1217
// First things first: id Object Id is used, most likely that's it
1216
1218
if (_objectIdReader != null ) {
1217
1219
return deserializeFromObjectId (p , ctxt );
1218
1220
}
1219
-
1221
+ final JsonDeserializer < Object > delegateDeser = _delegateDeserializer ();
1220
1222
switch (p .getNumberType ()) {
1221
1223
case INT :
1222
- if (_delegateDeserializer != null ) {
1224
+ if (delegateDeser != null ) {
1223
1225
if (!_valueInstantiator .canCreateFromInt ()) {
1224
1226
Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1225
- _delegateDeserializer .deserialize (p , ctxt ));
1227
+ delegateDeser .deserialize (p , ctxt ));
1226
1228
if (_injectables != null ) {
1227
1229
injectValues (ctxt , bean );
1228
1230
}
@@ -1231,10 +1233,10 @@ public Object deserializeFromNumber(JsonParser p, DeserializationContext ctxt) t
1231
1233
}
1232
1234
return _valueInstantiator .createFromInt (ctxt , p .getIntValue ());
1233
1235
case LONG :
1234
- if (_delegateDeserializer != null ) {
1236
+ if (delegateDeser != null ) {
1235
1237
if (!_valueInstantiator .canCreateFromInt ()) {
1236
1238
Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1237
- _delegateDeserializer .deserialize (p , ctxt ));
1239
+ delegateDeser .deserialize (p , ctxt ));
1238
1240
if (_injectables != null ) {
1239
1241
injectValues (ctxt , bean );
1240
1242
}
@@ -1244,9 +1246,9 @@ public Object deserializeFromNumber(JsonParser p, DeserializationContext ctxt) t
1244
1246
return _valueInstantiator .createFromLong (ctxt , p .getLongValue ());
1245
1247
}
1246
1248
// actually, could also be BigInteger, so:
1247
- if (_delegateDeserializer != null ) {
1249
+ if (delegateDeser != null ) {
1248
1250
Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1249
- _delegateDeserializer .deserialize (p , ctxt ));
1251
+ delegateDeser .deserialize (p , ctxt ));
1250
1252
if (_injectables != null ) {
1251
1253
injectValues (ctxt , bean );
1252
1254
}
@@ -1263,13 +1265,14 @@ public Object deserializeFromString(JsonParser p, DeserializationContext ctxt) t
1263
1265
if (_objectIdReader != null ) {
1264
1266
return deserializeFromObjectId (p , ctxt );
1265
1267
}
1266
-
1267
1268
/* Bit complicated if we have delegating creator; may need to use it,
1268
1269
* or might not...
1269
1270
*/
1270
- if (_delegateDeserializer != null ) {
1271
+ JsonDeserializer <Object > delegateDeser = _delegateDeserializer ();
1272
+ if (delegateDeser != null ) {
1271
1273
if (!_valueInstantiator .canCreateFromString ()) {
1272
- Object bean = _valueInstantiator .createUsingDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
1274
+ Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1275
+ delegateDeser .deserialize (p , ctxt ));
1273
1276
if (_injectables != null ) {
1274
1277
injectValues (ctxt , bean );
1275
1278
}
@@ -1288,9 +1291,11 @@ public Object deserializeFromDouble(JsonParser p, DeserializationContext ctxt) t
1288
1291
NumberType t = p .getNumberType ();
1289
1292
// no separate methods for taking float...
1290
1293
if ((t == NumberType .DOUBLE ) || (t == NumberType .FLOAT )) {
1291
- if (_delegateDeserializer != null ) {
1294
+ JsonDeserializer <Object > delegateDeser = _delegateDeserializer ();
1295
+ if (delegateDeser != null ) {
1292
1296
if (!_valueInstantiator .canCreateFromDouble ()) {
1293
- Object bean = _valueInstantiator .createUsingDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
1297
+ Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1298
+ delegateDeser .deserialize (p , ctxt ));
1294
1299
if (_injectables != null ) {
1295
1300
injectValues (ctxt , bean );
1296
1301
}
@@ -1300,8 +1305,10 @@ public Object deserializeFromDouble(JsonParser p, DeserializationContext ctxt) t
1300
1305
return _valueInstantiator .createFromDouble (ctxt , p .getDoubleValue ());
1301
1306
}
1302
1307
// actually, could also be BigDecimal, so:
1303
- if (_delegateDeserializer != null ) {
1304
- return _valueInstantiator .createUsingDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
1308
+ JsonDeserializer <Object > delegateDeser = _delegateDeserializer ();
1309
+ if (delegateDeser != null ) {
1310
+ return _valueInstantiator .createUsingDelegate (ctxt ,
1311
+ delegateDeser .deserialize (p , ctxt ));
1305
1312
}
1306
1313
return ctxt .handleMissingInstantiator (handledType (), p ,
1307
1314
"no suitable creator method found to deserialize from Number value (%s)" ,
@@ -1313,9 +1320,11 @@ public Object deserializeFromDouble(JsonParser p, DeserializationContext ctxt) t
1313
1320
*/
1314
1321
public Object deserializeFromBoolean (JsonParser p , DeserializationContext ctxt ) throws IOException
1315
1322
{
1316
- if (_delegateDeserializer != null ) {
1323
+ JsonDeserializer <Object > delegateDeser = _delegateDeserializer ();
1324
+ if (delegateDeser != null ) {
1317
1325
if (!_valueInstantiator .canCreateFromBoolean ()) {
1318
- Object bean = _valueInstantiator .createUsingDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
1326
+ Object bean = _valueInstantiator .createUsingDelegate (ctxt ,
1327
+ delegateDeser .deserialize (p , ctxt ));
1319
1328
if (_injectables != null ) {
1320
1329
injectValues (ctxt , bean );
1321
1330
}
@@ -1328,29 +1337,16 @@ public Object deserializeFromBoolean(JsonParser p, DeserializationContext ctxt)
1328
1337
1329
1338
public Object deserializeFromArray (JsonParser p , DeserializationContext ctxt ) throws IOException
1330
1339
{
1331
- if (_arrayDelegateDeserializer != null ) {
1332
- try {
1333
- Object bean = _valueInstantiator .createUsingArrayDelegate (ctxt , _arrayDelegateDeserializer .deserialize (p , ctxt ));
1334
- if (_injectables != null ) {
1335
- injectValues (ctxt , bean );
1336
- }
1337
- return bean ;
1338
- } catch (Exception e ) {
1339
- return wrapInstantiationProblem (e , ctxt );
1340
- }
1341
- }
1340
+ // note: can not call `_delegateDeserializer()` since order reversed here:
1341
+ JsonDeserializer <Object > delegateDeser = _arrayDelegateDeserializer ;
1342
1342
// fallback to non-array delegate
1343
- if (_delegateDeserializer != null ) {
1344
- try {
1345
- Object bean = _valueInstantiator .createUsingArrayDelegate (ctxt , _delegateDeserializer .deserialize (p , ctxt ));
1346
- if (_injectables != null ) {
1347
- injectValues (ctxt , bean );
1348
- }
1349
- return bean ;
1350
- } catch (Exception e ) {
1351
- wrapInstantiationProblem (e , ctxt );
1352
- return null ;
1343
+ if ((delegateDeser != null ) || ((delegateDeser = _delegateDeserializer ) != null )) {
1344
+ Object bean = _valueInstantiator .createUsingArrayDelegate (ctxt ,
1345
+ delegateDeser .deserialize (p , ctxt ));
1346
+ if (_injectables != null ) {
1347
+ injectValues (ctxt , bean );
1353
1348
}
1349
+ return bean ;
1354
1350
}
1355
1351
if (ctxt .isEnabled (DeserializationFeature .UNWRAP_SINGLE_VALUE_ARRAYS )) {
1356
1352
JsonToken t = p .nextToken ();
@@ -1388,6 +1384,17 @@ public Object deserializeFromEmbedded(JsonParser p, DeserializationContext ctxt)
1388
1384
return p .getEmbeddedObject ();
1389
1385
}
1390
1386
1387
+ /**
1388
+ * @since 2.9
1389
+ */
1390
+ private final JsonDeserializer <Object > _delegateDeserializer () {
1391
+ JsonDeserializer <Object > deser = _delegateDeserializer ;
1392
+ if (deser == null ) {
1393
+ deser = _arrayDelegateDeserializer ;
1394
+ }
1395
+ return deser ;
1396
+ }
1397
+
1391
1398
/*
1392
1399
/**********************************************************
1393
1400
/* Overridable helper methods
0 commit comments