Avoid MessageFormat rendering for exception messages in binding errors

Closes gh-36609

(cherry picked from commit 0150c4ba06)
This commit is contained in:
Juergen Hoeller
2026-04-08 13:57:22 +02:00
parent d356e7a238
commit 2801c7e23e
2 changed files with 39 additions and 7 deletions
@@ -16,6 +16,10 @@
package org.springframework.validation;
import java.io.Serializable;
import org.jspecify.annotations.Nullable;
import org.springframework.beans.PropertyAccessException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.util.Assert;
@@ -59,9 +63,8 @@ public class DefaultBindingErrorProcessor implements BindingErrorProcessor {
String fixedField = bindingResult.getNestedPath() + missingField;
String[] codes = bindingResult.resolveMessageCodes(MISSING_FIELD_ERROR_CODE, missingField);
Object[] arguments = getArgumentsForBindError(bindingResult.getObjectName(), fixedField);
FieldError error = new FieldError(bindingResult.getObjectName(), fixedField, "", true,
codes, arguments, "Field '" + fixedField + "' is required");
bindingResult.addError(error);
bindingResult.addError(new BindingFieldError(
bindingResult.getObjectName(), fixedField, "", codes, arguments));
}
@Override
@@ -75,10 +78,8 @@ public class DefaultBindingErrorProcessor implements BindingErrorProcessor {
if (ObjectUtils.isArray(rejectedValue)) {
rejectedValue = StringUtils.arrayToCommaDelimitedString(ObjectUtils.toObjectArray(rejectedValue));
}
FieldError error = new FieldError(bindingResult.getObjectName(), field, rejectedValue, true,
codes, arguments, ex.getLocalizedMessage());
error.wrap(ex);
bindingResult.addError(error);
bindingResult.addError(new BindingFieldError(
bindingResult.getObjectName(), field, rejectedValue, codes, arguments, ex));
}
/**
@@ -97,4 +98,31 @@ public class DefaultBindingErrorProcessor implements BindingErrorProcessor {
return new Object[] {new DefaultMessageSourceResolvable(codes, field)};
}
/**
* Subclass of {@code FieldError} with Spring-style default message rendering.
*/
@SuppressWarnings("serial")
private static class BindingFieldError extends FieldError implements Serializable {
public BindingFieldError(String objectName, String field, @Nullable Object rejectedValue, String[] codes,
Object[] arguments) {
super(objectName, field, rejectedValue, true, codes, arguments,
"Field '" + field + "' is required");
}
public BindingFieldError(String objectName, String field, @Nullable Object rejectedValue, String[] codes,
Object[] arguments, PropertyAccessException ex) {
super(objectName, field, rejectedValue, true, codes, arguments, ex.getLocalizedMessage());
wrap(ex);
}
@Override
public boolean shouldRenderDefaultMessage() {
return false;
}
}
}