Skip to content

Commit 429f70f

Browse files
committed
Fix #827 with minor modifications
1 parent dd9e751 commit 429f70f

File tree

5 files changed

+48
-17
lines changed

5 files changed

+48
-17
lines changed

release-notes/VERSION

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ Project: jackson-databind
7171
`java.util.Calendar` serialization
7272
#826: Replaced synchronized HashMap with ConcurrentHashMap in TypeDeserializerBase._findDeserializer
7373
(contributed by Lars P)
74+
#827: Fix for polymorphic custom map key serializer
75+
(reported by mjr6140@gitgub)
7476
- Remove old cglib compatibility tests; cause problems in Eclipse
7577

7678
2.5.4 (09-Jun-2015)

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -875,11 +875,12 @@ public void writeValue(JsonGenerator gen, Object value)
875875
&& (value instanceof Closeable)) {
876876
_writeCloseableValue(gen, value, _config);
877877
} else {
878-
if (_prefetch.valueSerializer != null) {
879-
_serializerProvider(_config).serializeValue(gen, value, _prefetch.rootType,
880-
_prefetch.valueSerializer);
878+
JsonSerializer<Object> ser = _prefetch.valueSerializer;
879+
if (ser != null) {
880+
_serializerProvider(_config).serializeValue(gen, value, _prefetch.rootType, ser);
881881
} else if (_prefetch.typeSerializer != null) {
882-
_serializerProvider(_config).serializePolymorphic(gen, value, _prefetch.typeSerializer);
882+
_serializerProvider(_config).serializePolymorphic(gen, value,
883+
_prefetch.rootType, _prefetch.typeSerializer);
883884
} else {
884885
_serializerProvider(_config).serializeValue(gen, value);
885886
}
@@ -888,7 +889,7 @@ public void writeValue(JsonGenerator gen, Object value)
888889
}
889890
}
890891
}
891-
892+
892893
/*
893894
/**********************************************************
894895
/* Serialization methods, others
@@ -1086,7 +1087,8 @@ protected final void _configAndWriteValue(JsonGenerator gen, Object value) throw
10861087
_serializerProvider(_config).serializeValue(gen, value, _prefetch.rootType,
10871088
_prefetch.valueSerializer);
10881089
} else if (_prefetch.typeSerializer != null) {
1089-
_serializerProvider(_config).serializePolymorphic(gen, value, _prefetch.typeSerializer);
1090+
_serializerProvider(_config).serializePolymorphic(gen, value,
1091+
_prefetch.rootType, _prefetch.typeSerializer);
10901092
} else {
10911093
_serializerProvider(_config).serializeValue(gen, value);
10921094
}
@@ -1121,7 +1123,8 @@ private final void _writeCloseable(JsonGenerator gen, Object value, Serializatio
11211123
_serializerProvider(cfg).serializeValue(gen, value, _prefetch.rootType,
11221124
_prefetch.valueSerializer);
11231125
} else if (_prefetch.typeSerializer != null) {
1124-
_serializerProvider(cfg).serializePolymorphic(gen, value, _prefetch.typeSerializer);
1126+
_serializerProvider(cfg).serializePolymorphic(gen, value,
1127+
_prefetch.rootType, _prefetch.typeSerializer);
11251128
} else {
11261129
_serializerProvider(cfg).serializeValue(gen, value);
11271130
}
@@ -1165,7 +1168,8 @@ private final void _writeCloseableValue(JsonGenerator gen, Object value, Seriali
11651168
_serializerProvider(cfg).serializeValue(gen, value, _prefetch.rootType,
11661169
_prefetch.valueSerializer);
11671170
} else if (_prefetch.typeSerializer != null) {
1168-
_serializerProvider(cfg).serializePolymorphic(gen, value, _prefetch.typeSerializer);
1171+
_serializerProvider(cfg).serializePolymorphic(gen, value,
1172+
_prefetch.rootType, _prefetch.typeSerializer);
11691173
} else {
11701174
_serializerProvider(cfg).serializeValue(gen, value);
11711175
}

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

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -268,25 +268,39 @@ public void serializeValue(JsonGenerator gen, Object value, JavaType rootType, J
268268
* Alternate serialization call used for polymorphic types, when {@link TypeSerializer}
269269
* is already known, but not actual value serializer.
270270
*
271-
* @since 2.5
271+
* @since 2.6
272272
*/
273-
public void serializePolymorphic(JsonGenerator gen, Object value, TypeSerializer typeSer)
274-
throws IOException
273+
public void serializePolymorphic(JsonGenerator gen, Object value,
274+
JavaType rootType, TypeSerializer typeSer)
275+
throws IOException
275276
{
276277
if (value == null) {
277278
_serializeNull(gen);
278279
return;
279280
}
280-
final Class<?> type = value.getClass();
281-
JsonSerializer<Object> ser = findValueSerializer(type, null);
281+
// Let's ensure types are compatible at this point
282+
if ((rootType != null) && !rootType.getRawClass().isAssignableFrom(value.getClass())) {
283+
_reportIncompatibleRootType(value, rootType);
284+
}
285+
JsonSerializer<Object> ser;
286+
/* 12-Jun-2015, tatu: nominal root type is necessary for Maps at least;
287+
* possibly collections, but can cause problems for other polymorphic
288+
* types. We really need to distinguish between serialization type,
289+
* base type; but right we don't. Hence this check
290+
*/
291+
if ((rootType != null) && rootType.isContainerType()) {
292+
ser = findValueSerializer(rootType, null);
293+
} else {
294+
ser = findValueSerializer(value.getClass(), null);
295+
}
282296

283297
final boolean wrap;
284298
PropertyName rootName = _config.getFullRootName();
285299
if (rootName == null) {
286300
wrap = _config.isEnabled(SerializationFeature.WRAP_ROOT_VALUE);
287301
if (wrap) {
288302
gen.writeStartObject();
289-
PropertyName pname = _config.findRootName(type);
303+
PropertyName pname = _config.findRootName(value.getClass());
290304
gen.writeFieldName(pname.simpleAsEncoded(_config));
291305
}
292306
} else if (rootName.isEmpty()) {
@@ -311,7 +325,18 @@ public void serializePolymorphic(JsonGenerator gen, Object value, TypeSerializer
311325
throw new JsonMappingException(msg, e);
312326
}
313327
}
314-
328+
329+
/**
330+
* @deprecated since 2.6; remove from 2.7 or later
331+
*/
332+
@Deprecated
333+
public void serializePolymorphic(JsonGenerator gen, Object value, TypeSerializer typeSer)
334+
throws IOException
335+
{
336+
JavaType t = (value == null) ? null : _config.constructType(value.getClass());
337+
serializePolymorphic(gen, value, t, typeSer);
338+
}
339+
315340
/**
316341
* Helper method called when root value to serialize is null
317342
*

src/test/java/com/fasterxml/jackson/databind/seq/ObjectWriterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void testObjectWriterWithNode() throws Exception
9393
assertEquals("{\"a\":5}", json);
9494
}
9595

96-
public void testPolymorpicWithTyping() throws Exception
96+
public void testPolymorphicWithTyping() throws Exception
9797
{
9898
ObjectWriter writer = MAPPER.writerFor(PolyBase.class);
9999
String json;

src/test/java/com/fasterxml/jackson/failing/PolyMapWriter827Test.java renamed to src/test/java/com/fasterxml/jackson/databind/seq/PolyMapWriter827Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.failing;
1+
package com.fasterxml.jackson.databind.seq;
22

33
import java.io.IOException;
44
import java.util.HashMap;

0 commit comments

Comments
 (0)