diff --git a/release-notes/VERSION b/release-notes/VERSION index cd924e255d..0951cef32d 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, diff --git a/src/main/java/tools/jackson/databind/AnnotationIntrospector.java b/src/main/java/tools/jackson/databind/AnnotationIntrospector.java index c854e340a0..4123839ae9 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 0078b99387..402dc97f90 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 0010edce60..fcb64817b1 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 d5a6880925..cd0217c4e2 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 7a0f2bcd6c..b4ca6ba36f 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 196d7cd71b..8bd04bed40 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")) {