From ec0571f73a856f6076ef8e035c53402cfa5c70d2 Mon Sep 17 00:00:00 2001 From: soldierkam Date: Thu, 16 Jul 2015 21:56:37 +0000 Subject: [PATCH] Multimap serializer ignores _valueTypeSerializer --- .../guava/ser/MultimapSerializer.java | 6 +- .../jackson/datatype/guava/TestMultimaps.java | 53 +++++++++++++++++ .../jackson/datatype/guava/pojo/AddOp.java | 58 +++++++++++++++++++ .../jackson/datatype/guava/pojo/MathOp.java | 17 ++++++ .../jackson/datatype/guava/pojo/MulOp.java | 58 +++++++++++++++++++ 5 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/fasterxml/jackson/datatype/guava/pojo/AddOp.java create mode 100644 src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MathOp.java create mode 100644 src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MulOp.java diff --git a/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java b/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java index 34ad976..820df60 100644 --- a/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java +++ b/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java @@ -316,7 +316,11 @@ private final void serializeFields(Multimap mmap, JsonGenerator gen, Seria serializers = _dynamicValueSerializers; } } - valueSer.serialize(vv, gen, provider); + if (_valueTypeSerializer == null) { + valueSer.serialize(vv, gen, provider); + } else { + valueSer.serializeWithType(vv, gen, provider, _valueTypeSerializer); + } } gen.writeEndArray(); } diff --git a/src/test/java/com/fasterxml/jackson/datatype/guava/TestMultimaps.java b/src/test/java/com/fasterxml/jackson/datatype/guava/TestMultimaps.java index dd863c1..f5d6b74 100644 --- a/src/test/java/com/fasterxml/jackson/datatype/guava/TestMultimaps.java +++ b/src/test/java/com/fasterxml/jackson/datatype/guava/TestMultimaps.java @@ -3,6 +3,9 @@ import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.guava.pojo.AddOp; +import com.fasterxml.jackson.datatype.guava.pojo.MathOp; +import com.fasterxml.jackson.datatype.guava.pojo.MulOp; import com.google.common.collect.*; @@ -11,6 +14,7 @@ import java.util.Map; import static com.google.common.collect.TreeMultimap.create; +import static junit.framework.TestCase.assertEquals; /** * Unit tests to verify handling of various {@link Multimap}s. @@ -254,4 +258,53 @@ public void testIssue67() throws IOException assertEquals(Maps.immutableEntry("a", 7), iterator.next()); assertEquals(Maps.immutableEntry("a", 8), iterator.next()); } + + public void testPolymorphicValue() throws IOException { + ImmutableMultimapWrapper input = new ImmutableMultimapWrapper(ImmutableMultimap.of("add", new AddOp(3, 2), "mul", new MulOp(4, 6))); + + String json = MAPPER.writeValueAsString(input); + + ImmutableMultimapWrapper output = MAPPER.readValue(json, ImmutableMultimapWrapper.class); + assertEquals(input, output); + } + + public static class ImmutableMultimapWrapper { + + private ImmutableMultimap multimap; + + public ImmutableMultimapWrapper() { + } + + public ImmutableMultimapWrapper(ImmutableMultimap f) { + this.multimap = f; + } + + public ImmutableMultimap getMultimap() { + return multimap; + } + + public void setMultimap(ImmutableMultimap multimap) { + this.multimap = multimap; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 97 * hash + (this.multimap != null ? this.multimap.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ImmutableMultimapWrapper other = (ImmutableMultimapWrapper) obj; + return !(this.multimap != other.multimap && (this.multimap == null || !this.multimap.equals(other.multimap))); + } + + } } diff --git a/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/AddOp.java b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/AddOp.java new file mode 100644 index 0000000..167a78e --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/AddOp.java @@ -0,0 +1,58 @@ +package com.fasterxml.jackson.datatype.guava.pojo; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcin Kamionowski + */ +public class AddOp implements MathOp { + + private final int left; + private final int right; + + @JsonCreator + public AddOp( + @JsonProperty("left") int left, + @JsonProperty("right") int right) { + this.left = left; + this.right = right; + } + + public int getLeft() { + return left; + } + + public int getRight() { + return right; + } + + public int value() { + return left + right; + } + + @Override + public int hashCode() { + int hash = 3; + hash = 47 * hash + this.left; + hash = 47 * hash + this.right; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final AddOp other = (AddOp) obj; + if (this.left != other.left) { + return false; + } + return this.right == other.right; + } + +} diff --git a/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MathOp.java b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MathOp.java new file mode 100644 index 0000000..afe3b7a --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MathOp.java @@ -0,0 +1,17 @@ +package com.fasterxml.jackson.datatype.guava.pojo; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * + * @author Marcin Kamionowski + */ +@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="_t") +@JsonSubTypes({ + @Type(name="add", value=AddOp.class), + @Type(name="mul", value=MulOp.class)}) +public interface MathOp { + +} diff --git a/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MulOp.java b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MulOp.java new file mode 100644 index 0000000..2fa9b49 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/datatype/guava/pojo/MulOp.java @@ -0,0 +1,58 @@ +package com.fasterxml.jackson.datatype.guava.pojo; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * + * @author Marcin Kamionowski + */ +public class MulOp implements MathOp { + + private final int left; + private final int right; + + @JsonCreator + public MulOp( + @JsonProperty("left") int left, + @JsonProperty("right") int right) { + this.left = left; + this.right = right; + } + + public int getLeft() { + return left; + } + + public int getRight() { + return right; + } + + public int value() { + return left * right; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 67 * hash + this.left; + hash = 67 * hash + this.right; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final MulOp other = (MulOp) obj; + if (this.left != other.left) { + return false; + } + return this.right == other.right; + } + +}