From b646094e4274e1a187fff7e530d341e32523e54f Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 8 Sep 2025 21:13:27 -0700 Subject: [PATCH 1/2] Fix #5302; pass default (0-param) constructor --- .../tools/jackson/databind/AnnotationIntrospector.java | 9 +++++---- .../databind/introspect/AnnotationIntrospectorPair.java | 8 +++++--- .../databind/introspect/POJOPropertiesCollector.java | 3 ++- .../deser/creators/NoParamsCreatorDefault5045Test.java | 4 +++- .../introspect/DefaultCreatorDetection4584Test.java | 4 +++- .../introspect/DefaultCreatorResolution4620Test.java | 3 ++- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/tools/jackson/databind/AnnotationIntrospector.java b/src/main/java/tools/jackson/databind/AnnotationIntrospector.java index c854e340a00..4123839ae91 100644 --- a/src/main/java/tools/jackson/databind/AnnotationIntrospector.java +++ b/src/main/java/tools/jackson/databind/AnnotationIntrospector.java @@ -1176,18 +1176,19 @@ public JsonCreator.Mode findCreatorAnnotation(MapperConfig config, Annotated * * @param config Configuration settings in effect (for deserialization) * @param valueClass Class being instantiated; defines Creators passed - * @param declaredConstructors Constructors value class declares + * @param declaredConstructors Constructors value class declares (EXCEPT possible + * 0-parameter ("default") constructor which is passed separately) * @param declaredFactories Factory methods value class declares + * @param zeroParamsConstructor 0-parameter ("default") constructor, if class has one. * * @return Default Creator to possibly use for {@code valueClass}, if one can be * determined; {@code null} if not. - * - * @since 2.18 */ public PotentialCreator findPreferredCreator(MapperConfig config, AnnotatedClass valueClass, List declaredConstructors, - List declaredFactories) { + List declaredFactories, + Optional zeroParamsConstructor) { return null; } diff --git a/src/main/java/tools/jackson/databind/introspect/AnnotationIntrospectorPair.java b/src/main/java/tools/jackson/databind/introspect/AnnotationIntrospectorPair.java index 0078b993878..402dc97f908 100644 --- a/src/main/java/tools/jackson/databind/introspect/AnnotationIntrospectorPair.java +++ b/src/main/java/tools/jackson/databind/introspect/AnnotationIntrospectorPair.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; import com.fasterxml.jackson.annotation.*; @@ -668,12 +669,13 @@ public JsonCreator.Mode findCreatorAnnotation(MapperConfig config, Annotated public PotentialCreator findPreferredCreator(MapperConfig config, AnnotatedClass valueClass, List declaredConstructors, - List declaredFactories) { + List declaredFactories, + Optional zeroParamsConstructor) { PotentialCreator primaryCtor = _primary.findPreferredCreator(config, - valueClass, declaredConstructors, declaredFactories); + valueClass, declaredConstructors, declaredFactories, zeroParamsConstructor); if (primaryCtor == null) { primaryCtor = _secondary.findPreferredCreator(config, - valueClass, declaredConstructors, declaredFactories); + valueClass, declaredConstructors, declaredFactories, zeroParamsConstructor); } return primaryCtor; } diff --git a/src/main/java/tools/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/tools/jackson/databind/introspect/POJOPropertiesCollector.java index 0010edce604..fcb64817b14 100644 --- a/src/main/java/tools/jackson/databind/introspect/POJOPropertiesCollector.java +++ b/src/main/java/tools/jackson/databind/introspect/POJOPropertiesCollector.java @@ -654,7 +654,8 @@ protected void _addCreators(Map props) primaryCreator = RecordUtil.findCanonicalRecordConstructor(_config, _classDef, constructors); } else { primaryCreator = _annotationIntrospector.findPreferredCreator(_config, _classDef, - constructors, factories); + constructors, factories, + Optional.ofNullable(zeroParamsConstructor)); } // Next: remove creators marked as explicitly disabled _removeDisabledCreators(constructors); diff --git a/src/test/java/tools/jackson/databind/deser/creators/NoParamsCreatorDefault5045Test.java b/src/test/java/tools/jackson/databind/deser/creators/NoParamsCreatorDefault5045Test.java index d5a68809251..cd0217c4e21 100644 --- a/src/test/java/tools/jackson/databind/deser/creators/NoParamsCreatorDefault5045Test.java +++ b/src/test/java/tools/jackson/databind/deser/creators/NoParamsCreatorDefault5045Test.java @@ -1,6 +1,7 @@ package tools.jackson.databind.deser.creators; import java.util.List; +import java.util.Optional; import org.junit.jupiter.api.Test; @@ -38,7 +39,8 @@ static class AI5045 extends ImplicitNameIntrospector { public PotentialCreator findPreferredCreator(MapperConfig config, AnnotatedClass valueClass, List declaredConstructors, - List declaredFactories) + List declaredFactories, + Optional zeroParamsConstructor) { for (PotentialCreator pc : declaredConstructors) { if (pc.paramCount() != 0) { diff --git a/src/test/java/tools/jackson/databind/introspect/DefaultCreatorDetection4584Test.java b/src/test/java/tools/jackson/databind/introspect/DefaultCreatorDetection4584Test.java index 7a0f2bcd6c8..b4ca6ba36fc 100644 --- a/src/test/java/tools/jackson/databind/introspect/DefaultCreatorDetection4584Test.java +++ b/src/test/java/tools/jackson/databind/introspect/DefaultCreatorDetection4584Test.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import org.junit.jupiter.api.Test; @@ -117,7 +118,8 @@ public PrimaryCreatorFindingIntrospector(JsonCreator.Mode mode, public PotentialCreator findPreferredCreator(MapperConfig config, AnnotatedClass valueClass, List declaredConstructors, - List declaredFactories) + List declaredFactories, + Optional zeroParamsConstructor) { // Apply to all test POJOs here but nothing else if (!valueClass.getRawType().toString().contains("4584")) { diff --git a/src/test/java/tools/jackson/databind/introspect/DefaultCreatorResolution4620Test.java b/src/test/java/tools/jackson/databind/introspect/DefaultCreatorResolution4620Test.java index 196d7cd71bd..8bd04bed408 100644 --- a/src/test/java/tools/jackson/databind/introspect/DefaultCreatorResolution4620Test.java +++ b/src/test/java/tools/jackson/databind/introspect/DefaultCreatorResolution4620Test.java @@ -51,7 +51,8 @@ public PrimaryConstructorFindingIntrospector(Class... argTypes) { public PotentialCreator findPreferredCreator(MapperConfig config, AnnotatedClass valueClass, List declaredConstructors, - List declaredFactories) + List declaredFactories, + Optional zeroParamsConstructor) { // Apply to all test POJOs here but nothing else if (!valueClass.getRawType().toString().contains("4620")) { From c140bc87a22d69fbd67f0a8b40c8962698fe9712 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 8 Sep 2025 21:14:59 -0700 Subject: [PATCH 2/2] ... --- release-notes/VERSION | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/release-notes/VERSION b/release-notes/VERSION index cd924e255d5..0951cef32d8 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -5,6 +5,10 @@ Versions: 3.x (for earlier see VERSION-2.x) === Releases === ------------------------------------------------------------------------ +3.0.0-rc10 (not yet released) + +#5302: Add one more parameter for `AnnotationIntrospector.findPreferredCreator()` method + 3.0.0-rc9 (05-Sep-2025) #4210: `ParameterNamesModule` causes `@ConstructorProperties` to be ignored,