Skip to content

Commit c799b42

Browse files
committed
Start working on proper fix for #357
1 parent 06c1f89 commit c799b42

File tree

8 files changed

+48
-21
lines changed

8 files changed

+48
-21
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,14 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
201201
ser = _valueSerializer;
202202
}
203203
// [databind#124]: May have a content converter
204-
ser = findConvertingContentSerializer(provider, property, ser);
204+
ser = findContextualConvertingSerializer(provider, property, ser);
205205
if (ser == null) {
206206
// 30-Sep-2012, tatu: One more thing -- if explicit content type is annotated,
207207
// we can consider it a static case as well.
208208
// 20-Aug-2013, tatu: Need to avoid trying to access serializer for java.lang.Object tho
209209
if (_valueTypeIsStatic && !_valueType.isJavaLangObject()) {
210210
ser = provider.findValueSerializer(_valueType, property);
211211
}
212-
} else {
213-
ser = provider.handleSecondaryContextualization(ser, property);
214212
}
215213
if (keySer == null) {
216214
keySer = _keySerializer;

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,9 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
107107
ser = _elementSerializer;
108108
}
109109
// May have a content converter
110-
ser = findConvertingContentSerializer(provider, property, ser);
110+
ser = findContextualConvertingSerializer(provider, property, ser);
111111
if (ser == null) {
112112
ser = provider.findValueSerializer(String.class, property);
113-
} else {
114-
ser = provider.handleSecondaryContextualization(ser, property);
115113
}
116114
// Optimization: default serializer just writes String, so we can avoid a call:
117115
if (isDefaultSerializer(ser)) {

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
191191
ser = _elementSerializer;
192192
}
193193
// 18-Feb-2013, tatu: May have a content converter:
194-
ser = findConvertingContentSerializer(serializers, property, ser);
194+
ser = findContextualConvertingSerializer(serializers, property, ser);
195195
if (ser == null) {
196196
// 30-Sep-2012, tatu: One more thing -- if explicit content type is annotated,
197197
// we can consider it a static case as well.
@@ -200,8 +200,6 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
200200
ser = serializers.findValueSerializer(_elementType, property);
201201
}
202202
}
203-
} else {
204-
ser = serializers.handleSecondaryContextualization(ser, property);
205203
}
206204
if ((ser != _elementSerializer)
207205
|| (property != _property)

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,16 +415,14 @@ public JsonSerializer<?> createContextual(SerializerProvider provider,
415415
ser = _valueSerializer;
416416
}
417417
// [databind#124]: May have a content converter
418-
ser = findConvertingContentSerializer(provider, property, ser);
418+
ser = findContextualConvertingSerializer(provider, property, ser);
419419
if (ser == null) {
420420
// 30-Sep-2012, tatu: One more thing -- if explicit content type is annotated,
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()) {
424424
ser = provider.findValueSerializer(_valueType, property);
425425
}
426-
} else {
427-
ser = provider.handleSecondaryContextualization(ser, property);
428426
}
429427
if (keySer == null) {
430428
keySer = _keySerializer;

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
150150
ser = _elementSerializer;
151151
}
152152
// [databind#124]: May have a content converter
153-
ser = findConvertingContentSerializer(serializers, property, ser);
153+
ser = findContextualConvertingSerializer(serializers, property, ser);
154154
if (ser == null) {
155155
// 30-Sep-2012, tatu: One more thing -- if explicit content type is annotated,
156156
// we can consider it a static case as well.
@@ -159,8 +159,6 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
159159
ser = serializers.findValueSerializer(_elementType, property);
160160
}
161161
}
162-
} else {
163-
ser = serializers.handleSecondaryContextualization(ser, property);
164162
}
165163
return withResolved(property, vts, ser, unwrapSingle);
166164
}

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,9 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
7878
unwrapSingle = format.getFeature(JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED);
7979
}
8080
// [databind#124]: May have a content converter
81-
ser = findConvertingContentSerializer(serializers, property, ser);
81+
ser = findContextualConvertingSerializer(serializers, property, ser);
8282
if (ser == null) {
8383
ser = serializers.findValueSerializer(String.class, property);
84-
} else {
85-
ser = serializers.handleSecondaryContextualization(ser, property);
8684
}
8785
// Optimization: default serializer just writes String, so we can avoid a call:
8886
if (isDefaultSerializer(ser)) {
@@ -91,8 +89,7 @@ public JsonSerializer<?> createContextual(SerializerProvider serializers,
9189
}
9290
return _withResolved(property, unwrapSingle);
9391
}
94-
// otherwise
95-
92+
// otherwise...
9693
// note: will never have TypeSerializer, because Strings are "natural" type
9794
return new CollectionSerializer(serializers.constructType(String.class),
9895
true, /*TypeSerializer*/ null, (JsonSerializer<Object>) ser);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,15 @@ public void serialize(Object value, JsonGenerator gen, SerializerProvider provid
160160
provider.defaultSerializeNull(gen);
161161
return;
162162
}
163+
System.err.println(" delegating.serialize. value: "+value.getClass());
164+
163165
// 02-Apr-2015, tatu: As per [databind#731] may need to do dynamic lookup
164166
JsonSerializer<Object> ser = _delegateSerializer;
165167
if (ser == null) {
168+
System.err.println("DEBUG: dynamic lookup for delegator... ");
166169
ser = _findSerializer(delegateValue, provider);
167170
}
171+
System.err.println(" delegating.serialize with -> "+ser);
168172
ser.serialize(delegateValue, gen, provider);
169173
}
170174

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.io.IOException;
44
import java.lang.reflect.InvocationTargetException;
55
import java.lang.reflect.Type;
6+
import java.util.HashSet;
7+
import java.util.Set;
68

79
import com.fasterxml.jackson.annotation.JsonFormat;
810
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -345,8 +347,42 @@ public void wrapAndThrow(SerializerProvider provider,
345347
* @param existingSerializer (optional) configured content
346348
* serializer if one already exists.
347349
*
348-
* @since 2.2
350+
* @since 2.9
349351
*/
352+
protected JsonSerializer<?> findContextualConvertingSerializer(SerializerProvider provider,
353+
BeanProperty property, JsonSerializer<?> existingSerializer)
354+
throws JsonMappingException
355+
{
356+
// 08-Dec-2016, tatu: to fix [databind#357], need to prevent recursive calls for
357+
// same property
358+
/*
359+
@SuppressWarnings("unchecked")
360+
Set<Object> conversions = (Set<Object>) provider.getAttribute(CONTENT_CONVERTER_LOCK);
361+
if (conversions != null) {
362+
if (conversions.contains(property)) {
363+
return existingSerializer;
364+
}
365+
} else {
366+
conversions = new HashSet<>();
367+
provider.setAttribute(CONTENT_CONVERTER_LOCK, provider);
368+
}
369+
try {
370+
} finally {
371+
}
372+
*/
373+
JsonSerializer<?> ser = findConvertingContentSerializer(provider, property, existingSerializer);
374+
if (ser != null) {
375+
return provider.handleSecondaryContextualization(ser, property);
376+
}
377+
return existingSerializer;
378+
}
379+
380+
// private final static Object CONTENT_CONVERTER_LOCK = new Object();
381+
382+
/**
383+
* @deprecated Since 2.9 use {link {@link #findContextualConvertingSerializer} instead
384+
*/
385+
@Deprecated
350386
protected JsonSerializer<?> findConvertingContentSerializer(SerializerProvider provider,
351387
BeanProperty prop, JsonSerializer<?> existingSerializer)
352388
throws JsonMappingException

0 commit comments

Comments
 (0)