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.