@@ -115,13 +115,20 @@ public JsonSerializer<?> createContextual(SerializerProvider provider, BeanPrope
115
115
if (delegateType == null ) {
116
116
delegateType = _converter .getOutputType (provider .getTypeFactory ());
117
117
}
118
- delSer = provider .findValueSerializer (delegateType );
118
+ /* 02-Apr-2015, tatu: For "dynamic case", where type is only specified as
119
+ * java.lang.Object (or missing generic), [databind#731]
120
+ */
121
+ if (!delegateType .isJavaLangObject ()) {
122
+ delSer = provider .findValueSerializer (delegateType );
123
+ }
119
124
}
120
125
if (delSer instanceof ContextualSerializer ) {
121
126
delSer = provider .handleSecondaryContextualization (delSer , property );
122
127
}
123
- return (delSer == _delegateSerializer ) ? this
124
- : withDelegate (_converter , delegateType , delSer );
128
+ if (delSer == _delegateSerializer && delegateType == _delegateType ) {
129
+ return this ;
130
+ }
131
+ return withDelegate (_converter , delegateType , delSer );
125
132
}
126
133
127
134
/*
@@ -154,7 +161,12 @@ public void serialize(Object value, JsonGenerator gen, SerializerProvider provid
154
161
provider .defaultSerializeNull (gen );
155
162
return ;
156
163
}
157
- _delegateSerializer .serialize (delegateValue , gen , provider );
164
+ // 02-Apr-2015, tatu: As per [databind#731] may need to do dynamic lookup
165
+ JsonSerializer <Object > ser = _delegateSerializer ;
166
+ if (ser == null ) {
167
+ ser = _findSerializer (delegateValue , provider );
168
+ }
169
+ ser .serialize (delegateValue , gen , provider );
158
170
}
159
171
160
172
@ Override
@@ -165,21 +177,31 @@ public void serializeWithType(Object value, JsonGenerator gen, SerializerProvide
165
177
* let's give it a chance?
166
178
*/
167
179
Object delegateValue = convertValue (value );
168
- _delegateSerializer .serializeWithType (delegateValue , gen , provider , typeSer );
180
+ JsonSerializer <Object > ser = _delegateSerializer ;
181
+ if (ser == null ) {
182
+ ser = _findSerializer (value , provider );
183
+ }
184
+ ser .serializeWithType (delegateValue , gen , provider , typeSer );
169
185
}
170
186
171
187
@ Override
172
- @ Deprecated // since 1 .5
188
+ @ Deprecated // since 2 .5
173
189
public boolean isEmpty (Object value )
174
190
{
175
191
Object delegateValue = convertValue (value );
192
+ if (_delegateSerializer == null ) { // best we can do for now, too costly to look up
193
+ return (value == null );
194
+ }
176
195
return _delegateSerializer .isEmpty (delegateValue );
177
196
}
178
197
179
198
@ Override
180
199
public boolean isEmpty (SerializerProvider prov , Object value )
181
200
{
182
201
Object delegateValue = convertValue (value );
202
+ if (_delegateSerializer == null ) { // best we can do for now, too costly to look up
203
+ return (value == null );
204
+ }
183
205
return _delegateSerializer .isEmpty (prov , delegateValue );
184
206
}
185
207
@@ -216,7 +238,10 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
216
238
/* 03-Sep-2012, tatu: Not sure if this can be made to really work
217
239
* properly... but for now, try this:
218
240
*/
219
- _delegateSerializer .acceptJsonFormatVisitor (visitor , typeHint );
241
+ // 02-Apr-2015, tatu: For dynamic case, very little we can do
242
+ if (_delegateSerializer != null ) {
243
+ _delegateSerializer .acceptJsonFormatVisitor (visitor , typeHint );
244
+ }
220
245
}
221
246
222
247
/*
@@ -239,4 +264,19 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
239
264
protected Object convertValue (Object value ) {
240
265
return _converter .convert (value );
241
266
}
267
+
268
+ /**
269
+ * Helper method used for locating serializer to use in dynamic use case, where
270
+ * actual type value gets converted to is not specified beyond basic
271
+ * {@link java.lang.Object}, and where serializer needs to be located dynamically
272
+ * based on actual value type.
273
+ *
274
+ * @since 2.6
275
+ */
276
+ protected JsonSerializer <Object > _findSerializer (Object value , SerializerProvider serializers )
277
+ throws JsonMappingException
278
+ {
279
+ // NOTE: will NOT call contextualization
280
+ return serializers .findValueSerializer (value .getClass ());
281
+ }
242
282
}
0 commit comments