diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java index e59ee8090b..cb7d0600ef 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java @@ -467,7 +467,7 @@ protected JsonSerializer constructBeanOrAddOnSerializer(SerializerProvid for (int i = 0; i < props.size(); i++) { BeanPropertyWriter prop = props.get(i); // Either any-getter as field... - if (Objects.equals(prop.getName(), anyGetter.getName()) + if (Objects.equals(prop.getMember().getName(), anyGetter.getName()) // or as method || Objects.equals(prop.getMember().getMember(), anyGetter.getMember())) { diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterNameConflictSerialization5342Test.java b/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterNameConflictSerialization5342Test.java new file mode 100644 index 0000000000..aaa637dd63 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterNameConflictSerialization5342Test.java @@ -0,0 +1,75 @@ +package com.fasterxml.jackson.databind.ser; + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +// [databind#5342] JsonAnyGetter method serialization can override JsonProperty serialization on serialized name conflict +public class AnyGetterNameConflictSerialization5342Test + extends DatabindTestUtil +{ + public static class Pojo5342 { + @JsonIgnore + private Map additionalProperties; + @JsonProperty(value = "additionalProperties") + private Map hidden; + + @JsonAnySetter + private void additionalProperties(String key, Object value) { + if (additionalProperties == null) { + additionalProperties = new HashMap<>(); + } + additionalProperties.put(key.replace("\\.", "."), value); + } + + @JsonAnyGetter + public Map additionalProperties() { + return additionalProperties; + } + + public Map hidden() { + return hidden; + } + + public void hidden(Map additionalPropertiesProperty) { + this.hidden = additionalPropertiesProperty; + } + } + + private final ObjectMapper MAPPER = newJsonMapper(); + + @Test + public void testOverwrite() + throws Exception + { + Pojo5342 pojo = new Pojo5342(); + pojo.additionalProperties("foo", "bar"); + + Map hidden = new HashMap<>(); + hidden.put("fizz", "buzz"); + pojo.hidden(hidden); + + + String JSON = MAPPER.writeValueAsString(pojo); + // was in 2.18 : {"foo":"bar","additionalProperties": {"fizz":"buzz"}} + // now in 2.19 : {"foo":"bar"}... need FIX! + // hidden field + assertTrue(JSON.contains("\"additionalProperties\":{\"fizz\":\"buzz\"}")); + // any-getter + assertTrue(JSON.contains("\"foo\":\"bar\"")); + + // Try deserializaing back + Pojo5342 actual = MAPPER.readValue(JSON, Pojo5342.class); + assertEquals(1, actual.additionalProperties.size()); + assertEquals(1, actual.hidden().size()); + } + +} diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterOrdering4388Test.java b/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterOrdering4388Test.java index a4f72e5b8a..0baff3ac38 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterOrdering4388Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/AnyGetterOrdering4388Test.java @@ -127,6 +127,7 @@ public Map secondProperties() { } } + // @JsonPropertyOrder({ "firstProperty", "secondProperties", "thirdProperty", "forthProperty" }) static class PrivateAnyGetterPojoSorted extends PrivateAnyGetterPojo { public Map getSecondProperties() { @@ -277,20 +278,6 @@ public void testPrivateAnyGetter() throws Exception { json); } - @Test - public void testPrivateAnyGetterSorted() throws Exception { - PrivateAnyGetterPojoSorted pojo = new PrivateAnyGetterPojoSorted(); - pojo.add("secondProperty", 2); - String json = MAPPER.writeValueAsString(pojo); - - assertEquals(a2q("{" + - "'firstProperty':1," + - "'secondProperty':2," + // private accesor, wont' work here - "'thirdProperty':3," + - "'forthProperty':4}"), - json); - } - private void _configureValues(BaseWithProperties base) { base.entityId = 1; base.entityName = "Bob";