@@ -54,7 +54,6 @@ public final class DeserializerCache
54
54
protected final HashMap <JavaType , JsonDeserializer <Object >> _incompleteDeserializers
55
55
= new HashMap <JavaType , JsonDeserializer <Object >>(8 );
56
56
57
-
58
57
/**
59
58
* We hold an explicit lock while creating deserializers to avoid creating duplicates.
60
59
*/
@@ -166,7 +165,6 @@ public JsonDeserializer<Object> findValueDeserializer(DeserializationContext ctx
166
165
throws JsonMappingException
167
166
{
168
167
Objects .requireNonNull (propertyType , "Null 'propertyType' passed" );
169
-
170
168
JsonDeserializer <Object > deser = _findCachedDeserializer (propertyType );
171
169
if (deser == null ) {
172
170
// If not, need to request factory to construct (or recycle)
@@ -255,26 +253,33 @@ protected JsonDeserializer<Object> _createAndCacheValueDeserializer(Deserializat
255
253
// Only one thread to construct deserializers at any given point in time;
256
254
// limitations necessary to ensure that only completely initialized ones
257
255
// are visible and used.
258
-
259
- try {
260
- _incompleteDeserializersLock .lock ();
261
-
262
- // Ok, then: could it be that due to a race condition, deserializer can now be found?
263
- JsonDeserializer <Object > deser = _findCachedDeserializer (type );
256
+ final boolean isCustom = _hasCustomHandlers (type );
257
+ if (!isCustom ) {
258
+ JsonDeserializer <Object > deser = _cachedDeserializers .get (type );
264
259
if (deser != null ) {
265
260
return deser ;
266
261
}
262
+ }
263
+ _incompleteDeserializersLock .lock ();
264
+ try {
265
+ if (!isCustom ) {
266
+ JsonDeserializer <Object > deser = _cachedDeserializers .get (type );
267
+ if (deser != null ) {
268
+ return deser ;
269
+ }
270
+ }
271
+ // Ok, then: could it be that due to a race condition, deserializer can now be found?
267
272
int count = _incompleteDeserializers .size ();
268
273
// Or perhaps being resolved right now?
269
274
if (count > 0 ) {
270
- deser = _incompleteDeserializers .get (type );
275
+ JsonDeserializer < Object > deser = _incompleteDeserializers .get (type );
271
276
if (deser != null ) {
272
277
return deser ;
273
278
}
274
279
}
275
280
// Nope: need to create and possibly cache
276
281
try {
277
- return _createAndCache2 (ctxt , factory , type );
282
+ return _createAndCache2 (ctxt , factory , type , isCustom );
278
283
} finally {
279
284
// also: any deserializers that have been created are complete by now
280
285
if (count == 0 && _incompleteDeserializers .size () > 0 ) {
@@ -289,10 +294,21 @@ protected JsonDeserializer<Object> _createAndCacheValueDeserializer(Deserializat
289
294
/**
290
295
* Method that handles actual construction (via factory) and caching (both
291
296
* intermediate and eventual)
297
+ *
298
+ * @deprecated Since 2.18 use version of _createAndCache2 that takes `isCustom` flag
292
299
*/
300
+ @ Deprecated // since 2.18, remove from 2.19
293
301
protected JsonDeserializer <Object > _createAndCache2 (DeserializationContext ctxt ,
294
302
DeserializerFactory factory , JavaType type )
295
303
throws JsonMappingException
304
+ {
305
+ return _createAndCache2 (ctxt , factory , type , _hasCustomHandlers (type ));
306
+ }
307
+
308
+ // @since 2.18
309
+ protected JsonDeserializer <Object > _createAndCache2 (DeserializationContext ctxt ,
310
+ DeserializerFactory factory , JavaType type , boolean isCustom )
311
+ throws JsonMappingException
296
312
{
297
313
JsonDeserializer <Object > deser ;
298
314
try {
@@ -306,11 +322,11 @@ protected JsonDeserializer<Object> _createAndCache2(DeserializationContext ctxt,
306
322
if (deser == null ) {
307
323
return null ;
308
324
}
309
- /* cache resulting deserializer? always true for "plain" BeanDeserializer
310
- * (but can be re-defined for sub-classes by using @JsonCachable!)
311
- */
325
+ // cache resulting deserializer? always true for "plain" BeanDeserializer
326
+ // (but can be re-defined for sub-classes by using @JsonCachable!)
327
+
312
328
// 27-Mar-2015, tatu: As per [databind#735], avoid caching types with custom value desers
313
- boolean addToCache = !_hasCustomHandlers ( type ) && deser .isCachable ();
329
+ boolean addToCache = !isCustom && deser .isCachable ();
314
330
315
331
/* we will temporarily hold on to all created deserializers (to
316
332
* handle cyclic references, and possibly reuse non-cached
@@ -321,9 +337,8 @@ protected JsonDeserializer<Object> _createAndCache2(DeserializationContext ctxt,
321
337
* either not add Lists or Maps, or clear references eagerly.
322
338
* Let's actually do both; since both seem reasonable.
323
339
*/
324
- /* Need to resolve? Mostly done for bean deserializers; required for
325
- * resolving cyclic references.
326
- */
340
+ // Need to resolve? Mostly done for bean deserializers; required for
341
+ // resolving cyclic references.
327
342
if (deser instanceof ResolvableDeserializer ) {
328
343
_incompleteDeserializers .put (type , deser );
329
344
try {
0 commit comments