Skip to content

Commit 09f3858

Browse files
committed
Add SerializerProvider.findContentValueSerializer() methods, change serializers to use where applicable
1 parent 4581953 commit 09f3858

12 files changed

+95
-19
lines changed

release-notes/VERSION-2.x

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Project: jackson-databind
1111
#2503: Support `@JsonSerialize(keyUsing)` and `@JsonDeserialize(keyUsing)` on Key class
1212
#2511: Add `SerializationFeature.WRITE_SELF_REFERENCES_AS_NULL`
1313
(contributed by Joongsoo P)
14+
- Add `SerializerProvider.findContentValueSerializer()` methods
1415

1516
2.10.1 (not yet released)
1617

src/main/java/com/fasterxml/jackson/databind/SerializerProvider.java

+79-4
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ public JsonSerializer<Object> findValueSerializer(JavaType valueType)
624624
* and method(s) called: this method should only be called when caller is
625625
* certain that this is the primary property value serializer.
626626
*
627+
* @param valueType Type of values to serialize
627628
* @param property Property that is being handled; will never be null, and its
628629
* type has to match <code>valueType</code> parameter.
629630
*
@@ -652,6 +653,8 @@ public JsonSerializer<Object> findPrimaryPropertySerializer(JavaType valueType,
652653
}
653654

654655
/**
656+
* See {@link #findPrimaryPropertySerializer(JavaType, BeanProperty)}
657+
*
655658
* @since 2.3
656659
*/
657660
@SuppressWarnings("unchecked")
@@ -678,7 +681,79 @@ public JsonSerializer<Object> findPrimaryPropertySerializer(Class<?> valueType,
678681
}
679682
return (JsonSerializer<Object>) handlePrimaryContextualization(ser, property);
680683
}
681-
684+
685+
/**
686+
* Alternative to {@link #findPrimaryPropertySerializer(JavaType, BeanProperty)} called not
687+
* for primary value, but "content" of such primary serializer: element of an array or
688+
* {@link java.util.Collection}, value of {@link java.util.Map} entry and so on.
689+
* This means that {@code property} passed (if any) does NOT represent value for which
690+
* serializer is requested but its secondary type (or secondary type of that type,
691+
* recursively).
692+
*<p>
693+
* Serializer returned SHOULD NOT handle type information; caller will (have to) add
694+
* suitable wrapping if necessary.
695+
*<p>
696+
* Note: this call will also contextualize serializer (call {@code createContextual()}
697+
* before returning it, if applicable (implements {@code ContextualSerializer})
698+
*
699+
* @param valueType Type of values to serialize
700+
* @param property Property that indirectly refers to value being serialized (optional,
701+
* may be {@code null} for root level serializers)
702+
*
703+
* @since 2.11
704+
*/
705+
@SuppressWarnings("unchecked")
706+
public JsonSerializer<Object> findContentValueSerializer(JavaType valueType, BeanProperty property)
707+
throws JsonMappingException
708+
{
709+
JsonSerializer<Object> ser = _knownSerializers.untypedValueSerializer(valueType);
710+
if (ser == null) {
711+
ser = _serializerCache.untypedValueSerializer(valueType);
712+
if (ser == null) {
713+
ser = _createAndCacheUntypedSerializer(valueType);
714+
if (ser == null) {
715+
ser = getUnknownTypeSerializer(valueType.getRawClass());
716+
// Should this be added to lookups?
717+
if (CACHE_UNKNOWN_MAPPINGS) {
718+
_serializerCache.addAndResolveNonTypedSerializer(valueType, ser, this);
719+
}
720+
return ser;
721+
}
722+
}
723+
}
724+
return (JsonSerializer<Object>) handleSecondaryContextualization(ser, property);
725+
}
726+
727+
/**
728+
* See {@link #findContentValueSerializer(JavaType, BeanProperty)}.
729+
*
730+
* @since 2.11
731+
*/
732+
@SuppressWarnings("unchecked")
733+
public JsonSerializer<Object> findContentValueSerializer(Class<?> valueType,
734+
BeanProperty property)
735+
throws JsonMappingException
736+
{
737+
JsonSerializer<Object> ser = _knownSerializers.untypedValueSerializer(valueType);
738+
if (ser == null) {
739+
ser = _serializerCache.untypedValueSerializer(valueType);
740+
if (ser == null) {
741+
ser = _serializerCache.untypedValueSerializer(_config.constructType(valueType));
742+
if (ser == null) {
743+
ser = _createAndCacheUntypedSerializer(valueType);
744+
if (ser == null) {
745+
ser = getUnknownTypeSerializer(valueType);
746+
if (CACHE_UNKNOWN_MAPPINGS) {
747+
_serializerCache.addAndResolveNonTypedSerializer(valueType, ser, this);
748+
}
749+
return ser;
750+
}
751+
}
752+
}
753+
}
754+
return (JsonSerializer<Object>) handleSecondaryContextualization(ser, property);
755+
}
756+
682757
/**
683758
* Method called to locate regular serializer, matching type serializer,
684759
* and if both found, wrap them in a serializer that calls both in correct
@@ -1383,10 +1458,10 @@ protected JsonSerializer<Object> _createUntypedSerializer(JavaType type)
13831458
// versions, likely due to concurrency fixes for `AnnotatedClass` introspection.
13841459
// This sync block could probably be removed; but to minimize any risk of
13851460
// regression sync block will only be removed from 3.0.
1386-
synchronized (_serializerCache) {
1387-
// 17-Feb-2013, tatu: Used to call deprecated method (that passed property)
1461+
// 23-Oct-2019, tatu: Due to continuation of 2.x line, removed from 2.11
1462+
// synchronized (_serializerCache) {
13881463
return (JsonSerializer<Object>)_serializerFactory.createSerializer(this, type);
1389-
}
1464+
// }
13901465
}
13911466

13921467
/**

src/main/java/com/fasterxml/jackson/databind/ser/ContainerSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public ContainerSerializer<?> withValueTypeSerializer(TypeSerializer vts) {
8080
* known statically.
8181
* Note that for dynamic types this may return null; if so,
8282
* caller has to instead use {@link #getContentType()} and
83-
* {@link com.fasterxml.jackson.databind.SerializerProvider#findValueSerializer}.
83+
* {@link com.fasterxml.jackson.databind.SerializerProvider#findContentValueSerializer}.
8484
*/
8585
public abstract JsonSerializer<?> getContentSerializer();
8686

src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
209209
// we can consider it a static case as well.
210210
// 20-Aug-2013, tatu: Need to avoid trying to access serializer for java.lang.Object tho
211211
if (_valueTypeIsStatic && !_valueType.isJavaLangObject()) {
212-
ser = provider.findValueSerializer(_valueType, property);
212+
ser = provider.findContentValueSerializer(_valueType, property);
213213
}
214214
}
215215
if (keySer == null) {

src/main/java/com/fasterxml/jackson/databind/ser/impl/PropertySerializerMap.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ public final SerializerAndMapResult findAndAddSecondarySerializer(Class<?> type,
8787
SerializerProvider provider, BeanProperty property)
8888
throws JsonMappingException
8989
{
90-
JsonSerializer<Object> serializer = provider.findValueSerializer(type, property);
90+
JsonSerializer<Object> serializer = provider.findContentValueSerializer(type, property);
9191
return new SerializerAndMapResult(serializer, newWith(type, serializer));
9292
}
9393

9494
public final SerializerAndMapResult findAndAddSecondarySerializer(JavaType type,
9595
SerializerProvider provider, BeanProperty property)
9696
throws JsonMappingException
9797
{
98-
JsonSerializer<Object> serializer = provider.findValueSerializer(type, property);
98+
JsonSerializer<Object> serializer = provider.findContentValueSerializer(type, property);
9999
return new SerializerAndMapResult(serializer, newWith(type.getRawClass(), serializer));
100100
}
101101

src/main/java/com/fasterxml/jackson/databind/ser/impl/StringArraySerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
109109
// May have a content converter
110110
ser = findContextualConvertingSerializer(provider, property, ser);
111111
if (ser == null) {
112-
ser = provider.findValueSerializer(String.class, property);
112+
ser = provider.findContentValueSerializer(String.class, property);
113113
}
114114
// Optimization: default serializer just writes String, so we can avoid a call:
115115
if (isDefaultSerializer(ser)) {

src/main/java/com/fasterxml/jackson/databind/ser/std/AsArraySerializerBase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
198198
// we can consider it a static case as well.
199199
if (_elementType != null) {
200200
if (_staticTyping && !_elementType.isJavaLangObject()) {
201-
ser = serializers.findValueSerializer(_elementType, property);
201+
ser = serializers.findContentValueSerializer(_elementType, property);
202202
}
203203
}
204204
}
@@ -292,7 +292,7 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
292292
// 19-Oct-2016, tatu: Apparently we get null for untyped/raw `EnumSet`s... not 100%
293293
// sure what'd be the clean way but let's try this for now:
294294
if (_elementType != null) {
295-
valueSer = visitor.getProvider().findValueSerializer(_elementType, _property);
295+
valueSer = visitor.getProvider().findContentValueSerializer(_elementType, _property);
296296
}
297297
}
298298
visitArrayFormat(visitor, typeHint, valueSer, _elementType);

src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void serializeContents(EnumSet<? extends Enum<?>> value, JsonGenerator ge
7979
if (enumSer == null) {
8080
// 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's
8181
// not bother with typed serializer variant here
82-
enumSer = provider.findValueSerializer(en.getDeclaringClass(), _property);
82+
enumSer = provider.findContentValueSerializer(en.getDeclaringClass(), _property);
8383
}
8484
enumSer.serialize(en, gen, provider);
8585
}

src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
421421
// we can consider it a static case as well.
422422
// 20-Aug-2013, tatu: Need to avoid trying to access serializer for java.lang.Object tho
423423
if (_valueTypeIsStatic && !_valueType.isJavaLangObject()) {
424-
ser = provider.findValueSerializer(_valueType, property);
424+
ser = provider.findContentValueSerializer(_valueType, property);
425425
}
426426
}
427427
if (keySer == null) {

src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
158158
// we can consider it a static case as well.
159159
if (_elementType != null) {
160160
if (_staticTyping && !_elementType.isJavaLangObject()) {
161-
ser = serializers.findValueSerializer(_elementType, property);
161+
ser = serializers.findContentValueSerializer(_elementType, property);
162162
}
163163
}
164164
}
@@ -327,7 +327,7 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
327327
*/
328328
JsonSerializer<?> valueSer = _elementSerializer;
329329
if (valueSer == null) {
330-
valueSer = visitor.getProvider().findValueSerializer(contentType, _property);
330+
valueSer = visitor.getProvider().findContentValueSerializer(contentType, _property);
331331
}
332332
arrayVisitor.itemsFormat(valueSer, contentType);
333333
}

src/main/java/com/fasterxml/jackson/databind/ser/std/ReferenceTypeSerializer.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,9 @@ private final JsonSerializer<Object> _findCachedSerializer(SerializerProvider pr
454454
// [databind#1673] Must ensure we will resolve all available type information
455455
// so as not to miss generic declaration of, say, `List<GenericPojo>`...
456456
JavaType fullType = provider.constructSpecializedType(_referredType, rawType);
457-
ser = provider.findValueSerializer(fullType, _property);
457+
ser = provider.findContentValueSerializer(fullType, _property);
458458
} else {
459-
ser = provider.findValueSerializer(rawType, _property);
459+
ser = provider.findContentValueSerializer(rawType, _property);
460460
}
461461
if (_unwrapper != null) {
462462
ser = ser.unwrappingSerializer(_unwrapper);
@@ -474,6 +474,6 @@ private final JsonSerializer<Object> _findSerializer(SerializerProvider provider
474474
// 15-Jan-2017, tatu: ... possibly because we need to access "secondary" serializer,
475475
// not primary (primary being one for Reference type itself, not value)
476476
// return provider.findTypedValueSerializer(type, true, prop);
477-
return provider.findValueSerializer(type, prop);
477+
return provider.findContentValueSerializer(type, prop);
478478
}
479479
}

src/main/java/com/fasterxml/jackson/databind/ser/std/StaticListSerializerBase.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
8383
// [databind#124]: May have a content converter
8484
ser = findContextualConvertingSerializer(serializers, property, ser);
8585
if (ser == null) {
86-
ser = serializers.findValueSerializer(String.class, property);
86+
ser = serializers.findContentValueSerializer(String.class, property);
8787
}
8888
// Optimization: default serializer just writes String, so we can avoid a call:
8989
if (isDefaultSerializer(ser)) {

0 commit comments

Comments
 (0)