From 92b096abbff1f124e77f3618c02c7af59b6b6bd9 Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Thu, 16 Dec 2021 12:19:23 -0600 Subject: [PATCH] Fix message interpolation when code is used as default message When `setUseCodeAsDefaultMessage(true)` was set on a message source, attempting to interpolate the default message returned from the message source would result in the code being unusable by upstream message resolvers. Fixes gh-28930 --- .../validation/MessageSourceMessageInterpolator.java | 8 +++++++- .../MessageSourceMessageInterpolatorTests.java | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/validation/MessageSourceMessageInterpolator.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/validation/MessageSourceMessageInterpolator.java index df797dc9b1..36342c8653 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/validation/MessageSourceMessageInterpolator.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/validation/MessageSourceMessageInterpolator.java @@ -30,6 +30,7 @@ import org.springframework.context.i18n.LocaleContextHolder; * message using the underlying {@link MessageInterpolator}. * * @author Dmytro Nosan + * @author Scott Frederick */ class MessageSourceMessageInterpolator implements MessageInterpolator { @@ -115,7 +116,12 @@ class MessageSourceMessageInterpolator implements MessageInterpolator { private String replaceParameter(String parameter, Locale locale, Set visitedParameters) { parameter = replaceParameters(parameter, locale, visitedParameters); String value = this.messageSource.getMessage(parameter, null, null, locale); - return (value != null) ? replaceParameters(value, locale, visitedParameters) : null; + return (value != null && !isUsingCodeAsDefaultMessage(value, parameter)) + ? replaceParameters(value, locale, visitedParameters) : null; + } + + private boolean isUsingCodeAsDefaultMessage(String value, String parameter) { + return value.equals(parameter); } } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/validation/MessageSourceMessageInterpolatorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/validation/MessageSourceMessageInterpolatorTests.java index c33d4997ee..f9fd339466 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/validation/MessageSourceMessageInterpolatorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/validation/MessageSourceMessageInterpolatorTests.java @@ -34,6 +34,7 @@ import static org.mockito.Mockito.mock; * * @author Dmytro Nosan * @author Andy Wilkinson + * @author Scott Frederick */ class MessageSourceMessageInterpolatorTests { @@ -58,6 +59,14 @@ class MessageSourceMessageInterpolatorTests { .isEqualTo("{foo}{child}+{child}{bar}"); } + @Test + void interpolateWhenParametersAreUnknownUsingCodeAsDefaultShouldLeaveThemUnchanged() { + this.messageSource.setUseCodeAsDefaultMessage(true); + this.messageSource.addMessage("top", Locale.getDefault(), "{child}+{child}"); + assertThat(this.interpolator.interpolate("{foo}{top}{bar}", this.context)) + .isEqualTo("{foo}{child}+{child}{bar}"); + } + @Test void interpolateWhenParametersAreNestedShouldFullyReplaceAllParameters() { this.messageSource.addMessage("top", Locale.getDefault(), "{child}+{child}");