blob: 859bbc980944c04b02d7e2c977dc5dfe3310b1f1 [file] [log] [blame]
package com.fasterxml.jackson.databind.deser.merge;
import java.util.LinkedHashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class MapPolymorphicMerge2336Test extends BaseMapTest
{
private final ObjectMapper MAPPER = sharedMapper();
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "discriminator")
@JsonSubTypes({@JsonSubTypes.Type(value = SomeClassA.class, name = "FirstConcreteImpl")})
@JsonInclude(JsonInclude.Include.NON_NULL)
public static abstract class SomeBaseClass {
private String name;
@JsonCreator
public SomeBaseClass(@JsonProperty("name") String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@JsonTypeName("FirstConcreteImpl")
public static class SomeClassA extends SomeBaseClass {
private Integer a;
private Integer b;
@JsonCreator
public SomeClassA(@JsonProperty("name") String name, @JsonProperty("a") Integer a, @JsonProperty("b") Integer b) {
super(name);
this.a = a;
this.b = b;
}
public Integer getA() {
return a;
}
public void setA(Integer a) {
this.a = a;
}
public Integer getB() {
return b;
}
public void setB(Integer b) {
this.b = b;
}
}
public static class SomeOtherClass {
String someprop;
@JsonCreator
public SomeOtherClass(@JsonProperty("someprop") String someprop) {
this.someprop = someprop;
}
@JsonMerge
Map<String, SomeBaseClass> data = new LinkedHashMap<>();
public void addValue(String key, SomeBaseClass value) {
data.put(key, value);
}
public Map<String, SomeBaseClass> getData() {
return data;
}
public void setData(
Map<String, SomeBaseClass> data) {
this.data = data;
}
}
// [databind#2336]
public void testPolymorphicMapMerge() throws Exception
{
// first let's just get some valid JSON
SomeOtherClass baseValue = new SomeOtherClass("house");
baseValue.addValue("SOMEKEY", new SomeClassA("fred", 1, null));
// now create a reader specifically for merging
ObjectReader reader = MAPPER.readerForUpdating(baseValue);
SomeOtherClass toBeMerged = new SomeOtherClass("house");
toBeMerged.addValue("SOMEKEY", new SomeClassA("jim", null, 2));
String jsonForMerging = MAPPER.writeValueAsString(toBeMerged);
assertEquals("fred", baseValue.data.get("SOMEKEY").getName());
// now try to do the merge and it blows up
SomeOtherClass mergedResult = reader.readValue(jsonForMerging);
// First of all, should update main POJO (since it's "value to update")
assertSame(baseValue, mergedResult);
// as well as Map within
assertSame(baseValue.data, mergedResult.data);
assertEquals(1, mergedResult.data.size());
// but entry value has changed by necessity
assertEquals(SomeClassA.class, mergedResult.data.get("SOMEKEY").getClass());
assertEquals("jim", mergedResult.data.get("SOMEKEY").getName());
}
}