Affects: 5.3.5


Problem

To resolve messages using DefaultMessageCodesResolver, two option exists. Specify only object, or specify with field and fieldtype. And 2nd option seems weird.
when call method with resolveMessageCodes("errorCode", "object", "field", String.class), 2nd option don't contain errorCode.object

Expectation : errorCode.object.field, errorCode.field, errorCode.object, errorCode.java.lang.String, errorCode Actual :errorCode.object.field, errorCode.field, errorCode.java.lang.String, errorCode

Example

public class MessageCodesResolverTest {
   MessageCodesResolver messageCodesResolver = new DefaultMessageCodesResolver();

   @Test
   void messageCodesResolver() {
      String[] messageCodes = messageCodesResolver.resolveMessageCodes("errorCode", "object", "field", String.class);

      Assertions.assertThat(messageCodes).contains("errorCode.object");

      // Expectation : "errorCode.object.field", "errorCode.field", "errorCode.object", "errorCode.java.lang.String", "errorCode"
      // Actual      : "errorCode.object.field", "errorCode.field", "errorCode.java.lang.String", "errorCode"
   }
}


Suggestion

At DefaultMessageCodesResolver, add addCode(codeList, errorCode, objectName, null); under line 160 like below

...
        if (dotIndex != -1) {
            buildFieldList(field.substring(dotIndex + 1), fieldList);
        }
        addCodes(codeList, errorCode, null, fieldList);
        addCode(codeList, errorCode, objectName, null);
        if (fieldType != null) {
            addCode(codeList, errorCode, null, fieldType.getName());
        }
...


I wanna edit myself and submit PR, but I'm suffering from building source, so I can't fix related tests.

Comment From: jhoeller

This is by design: That resolveMessageCodes variant is meant to resolve codes that are relevant for a particular field or its field type, and .object would not be specific to a field at all. This is consistent with the DefaultMessageCodesResolver javadoc and has been in place for 20 years already.