@@ -690,6 +690,13 @@ protected void _addCreators(Map<String, POJOPropertyBuilder> props)
690690 List <PotentialCreator > constructors = _collectCreators (_classDef .getConstructors ());
691691 List <PotentialCreator > factories = _collectCreators (_classDef .getFactoryMethods ());
692692
693+ // Note! 0-param ("default") constructor is NOT included in 'constructors':
694+ PotentialCreator zeroParamsConstructor ;
695+ {
696+ AnnotatedConstructor ac = _classDef .getDefaultConstructor ();
697+ zeroParamsConstructor = (ac == null ) ? null : _potentialCreator (ac );
698+ }
699+
693700 // Then find what is the Primary Constructor (if one exists for type):
694701 // for Java Records and potentially other types too ("data classes"):
695702 // Needs to be done early to get implicit names populated
@@ -699,20 +706,30 @@ protected void _addCreators(Map<String, POJOPropertyBuilder> props)
699706 } else {
700707 // 02-Nov-2024, tatu: Alas, naming here is confusing: method properly
701708 // should have been "findPrimaryCreator()" so as not to confused with
702- // 0-args default Creators...
709+ // 0-param default Creators...
703710 primaryCreator = _annotationIntrospector .findDefaultCreator (_config , _classDef ,
704711 constructors , factories );
705712 }
706713 // Next: remove creators marked as explicitly disabled
707714 _removeDisabledCreators (constructors );
708715 _removeDisabledCreators (factories );
709-
716+ if (zeroParamsConstructor != null && _isDisabledCreator (zeroParamsConstructor )) {
717+ zeroParamsConstructor = null ;
718+ }
719+
710720 // And then remove non-annotated static methods that do not look like factories
711721 _removeNonFactoryStaticMethods (factories , primaryCreator );
712722
713723 // and use annotations to find explicitly chosen Creators
714724 if (_useAnnotations ) { // can't have explicit ones without Annotation introspection
715- // Start with Constructors as they have higher precedence:
725+ // Start with Constructors as they have higher precedence
726+
727+ // 08-Sep-2025, tatu: [databind#5045] Need to ensure 0-param ("default")
728+ // constructor considered if annotated (disabled case handled above).
729+ if (zeroParamsConstructor != null && zeroParamsConstructor .isAnnotated ()) {
730+ creators .setPropertiesBased (_config , zeroParamsConstructor , "explicit" );
731+ }
732+
716733 _addExplicitlyAnnotatedCreators (creators , constructors , props , false );
717734 // followed by Factory methods (lower precedence)
718735 _addExplicitlyAnnotatedCreators (creators , factories , props ,
@@ -753,7 +770,7 @@ protected void _addCreators(Map<String, POJOPropertyBuilder> props)
753770 final ConstructorDetector ctorDetector = _config .getConstructorDetector ();
754771 if (!creators .hasPropertiesBasedOrDelegating ()
755772 && !ctorDetector .requireCtorAnnotation ()) {
756- // But only if no Default (0-args ) constructor available OR if we are configured
773+ // But only if no Default (0-params ) constructor available OR if we are configured
757774 // to prefer properties-based Creators
758775 if ((_classDef .getDefaultConstructor () == null )
759776 || ctorDetector .singleArgCreatorDefaultsToProperties ()) {
@@ -809,25 +826,33 @@ private List<PotentialCreator> _collectCreators(List<? extends AnnotatedWithPara
809826 }
810827 List <PotentialCreator > result = new ArrayList <>();
811828 for (AnnotatedWithParams ctor : ctors ) {
812- JsonCreator .Mode creatorMode = _useAnnotations
813- ? _annotationIntrospector .findCreatorAnnotation (_config , ctor ) : null ;
814829 // 06-Jul-2024, tatu: Can't yet drop DISABLED ones; add all (for now)
815- result .add (new PotentialCreator (ctor , creatorMode ));
830+ result .add (_potentialCreator (ctor ));
816831 }
817832 return (result == null ) ? Collections .emptyList () : result ;
818833 }
819834
835+ private PotentialCreator _potentialCreator (AnnotatedWithParams ctor ) {
836+ final JsonCreator .Mode creatorMode = _useAnnotations
837+ ? _annotationIntrospector .findCreatorAnnotation (_config , ctor ) : null ;
838+ return new PotentialCreator (ctor , creatorMode );
839+ }
840+
820841 private void _removeDisabledCreators (List <PotentialCreator > ctors )
821842 {
822843 Iterator <PotentialCreator > it = ctors .iterator ();
823844 while (it .hasNext ()) {
824- // explicitly prevented ? Remove
825- if (it .next (). creatorMode () == JsonCreator . Mode . DISABLED ) {
845+ // explicitly disabled ? Remove
846+ if (_isDisabledCreator ( it .next ()) ) {
826847 it .remove ();
827848 }
828849 }
829850 }
830851
852+ private boolean _isDisabledCreator (PotentialCreator ctor ) {
853+ return ctor .creatorMode () == JsonCreator .Mode .DISABLED ;
854+ }
855+
831856 private void _removeNonVisibleCreators (List <PotentialCreator > ctors )
832857 {
833858 Iterator <PotentialCreator > it = ctors .iterator ();
0 commit comments