diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index e568414295..418a3a5605 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -1778,6 +1778,11 @@ Ulf Dreyer (u3r@github) * Reported #4085: `@JsonView` does not work on class-level for records (2.18.0) +Mark Herkrath (herkrath@github) + * Reported #4356: `BeanDeserializerModifier::updateBuilder()` doesn't work for + beans with Creator methods + (2.18.0) + David Moten (davidmoten@github) * Contributed #4453: Allow JSON Integer to deserialize into a single-arg constructor of parameter type `double` diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index c331390623..c3ba557d11 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -18,6 +18,9 @@ Project: jackson-databind #4119: Exception when deserialization uses a record with a constructor property with `access=READ_ONLY` (reported by @Mochis) +#4356: `BeanDeserializerModifier::updateBuilder()` doesn't work for + beans with Creator methods + (reported by Mark H) #4452: `@JsonProperty` not serializing field names properly on `@JsonCreator` in Record (reported by @Incara) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java index f05666a764..3656530add 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBuilder.java @@ -57,6 +57,13 @@ public class BeanDeserializerBuilder final protected Map _properties = new LinkedHashMap(); + /** + * Parameters of the primary properties-based Creator, if any. + * + * @since 2.18 + */ + protected SettableBeanProperty[] _propsBasedCreatorParams; + /** * Value injectors for deserialization */ @@ -146,6 +153,7 @@ protected BeanDeserializerBuilder(BeanDeserializerBuilder src) _ignorableProps = src._ignorableProps; _includableProps = src._includableProps; _valueInstantiator = src._valueInstantiator; + _propsBasedCreatorParams = src._propsBasedCreatorParams; _objectIdReader = src._objectIdReader; _anySetter = src._anySetter; @@ -174,7 +182,14 @@ private static List _copy(List src) { * Method for adding a new property or replacing a property. */ public void addOrReplaceProperty(SettableBeanProperty prop, boolean allowOverride) { - _properties.put(prop.getName(), prop); + SettableBeanProperty oldProp = _properties.put(prop.getName(), prop); + if ((oldProp != null) && (_propsBasedCreatorParams != null)) { + for (int i = 0, len = _propsBasedCreatorParams.length; i < len; ++i) { + if (_propsBasedCreatorParams[i] == oldProp) { + _propsBasedCreatorParams[i] = prop; + } + } + } } /** @@ -295,6 +310,7 @@ public void setIgnoreUnknownProperties(boolean ignore) { public void setValueInstantiator(ValueInstantiator inst) { _valueInstantiator = inst; + _propsBasedCreatorParams = inst.getFromObjectArguments(_config); } public void setObjectIdReader(ObjectIdReader r) { diff --git a/src/test/java/com/fasterxml/jackson/failing/BeanDeserializerModifier4356Test.java b/src/test/java/com/fasterxml/jackson/failing/BeanDeserializerModifier4356Test.java index 4d70a08b72..5a3637a30d 100644 --- a/src/test/java/com/fasterxml/jackson/failing/BeanDeserializerModifier4356Test.java +++ b/src/test/java/com/fasterxml/jackson/failing/BeanDeserializerModifier4356Test.java @@ -75,7 +75,9 @@ public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx } } - private final ObjectMapper MAPPER = jsonMapperBuilder().addModule(getSimpleModuleWithDeserializerModifier()).build(); + private final ObjectMapper MAPPER = jsonMapperBuilder() + .addModule(getSimpleModuleWithDeserializerModifier()) + .build(); // passes @Test