@@ -383,49 +383,35 @@ protected ValueSerializer<Object> constructBeanOrAddOnSerializer(SerializationCo
383383 BeanProperty .Std anyProp = new BeanProperty .Std (name , valueType , null ,
384384 anyGetter , PropertyMetadata .STD_OPTIONAL );
385385
386- // Check if there is an accessor exposed for the anyGetter
387- BeanPropertyWriter anyGetterProp = null ;
388- int anyGetterIndex = -1 ;
389- for (int i = 0 ; i < props .size (); i ++) {
390- BeanPropertyWriter prop = props .get (i );
391- AnnotatedMember propMember = prop .getMember ();
392- if (propMember == null ) {
393- continue ;
394- }
395-
396- boolean matches = false ;
397- // [databind#5342]: Match only when the BeanPropertyWriter uses the same underlying member
398- // (method or field) as the @JsonAnyGetter accessor.
399- if (Objects .equals (propMember .getMember (), anyGetter .getMember ())) {
400- matches = true ;
401- } else if (anyGetter instanceof AnnotatedField
402- && propMember instanceof AnnotatedMethod ) {
403- String anyName = anyGetter .getName ();
404- String mName = propMember .getName ();
405- String capitalized = "" ;
406-
407- if (anyName .isEmpty ()) {
408- capitalized = anyName ;
409- } else if (anyName .length () == 1 ) {
410- capitalized = anyName .toUpperCase (Locale .ROOT );
411- } else {
412- capitalized = Character .toUpperCase (anyName .charAt (0 )) + anyName .substring (1 );
413- }
414- if (mName .equals ("get" + capitalized ) || mName .equals ("is" + capitalized )) {
415- matches = true ;
386+ // Check if there is an accessor exposed for the anyGetter.
387+ // First: by physical accessor (same Getter method or Field)
388+ final int propCount = props .size ();
389+ int ix = -1 ;
390+ // [databind#5342]: First match only when the BeanPropertyWriter uses the same
391+ // underlying member (method or field) as the @JsonAnyGetter accessor.
392+ for (int i = 0 ; i < propCount ; i ++) {
393+ AnnotatedMember propMember = props .get (i ).getMember ();
394+ if (propMember != null ) {
395+ if (Objects .equals (propMember .getMember (), anyGetter .getMember ())) {
396+ ix = i ;
397+ break ;
416398 }
417399 }
418-
419- if (matches ) {
420- anyGetterProp = prop ;
421- anyGetterIndex = i ;
422- break ;
400+ }
401+ // If that doesn't work, try match by logical property name
402+ if (ix < 0 ) {
403+ final String anyName = anyGetter .getName ();
404+ for (int i = 0 ; i < propCount ; i ++) {
405+ if (Objects .equals (anyName , props .get (i ).getName ())) {
406+ ix = i ;
407+ break ;
408+ }
423409 }
424410 }
425- if (anyGetterIndex != - 1 ) {
426- // There is prop is already in place, just need to replace it
427- AnyGetterWriter anyGetterWriter = new AnyGetterWriter ( anyGetterProp , anyProp , anyGetter , anySer );
428- props .set (anyGetterIndex , anyGetterWriter );
411+ if (ix >= 0 ) {
412+ BeanPropertyWriter anyGetterProp = props . get ( ix );
413+ // There is prop already in place, just need to replace it
414+ props .set (ix , new AnyGetterWriter ( anyGetterProp , anyProp , anyGetter , anySer ) );
429415 } else {
430416 // Otherwise just add it at the end, but won't be sorted...
431417 // This is case where JsonAnyGetter is private/protected,
0 commit comments