Skip to content

Commit 950d0b5

Browse files
committed
Merge branch '6.2.x'
2 parents bccd9e9 + 5ce5647 commit 950d0b5

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

spring-core/src/main/java/org/springframework/util/PlaceholderParser.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ public SimplePlaceholderPart(String text,String key, @Nullable String fallback)
512512

513513
@Override
514514
public String resolve(PartResolutionContext resolutionContext) {
515-
String value = resolveRecursively(resolutionContext, this.key);
515+
String value = resolveRecursively(resolutionContext);
516516
if (value != null) {
517517
return value;
518518
}
@@ -521,6 +521,17 @@ else if (this.fallback != null) {
521521
}
522522
return resolutionContext.handleUnresolvablePlaceholder(this.key, text());
523523
}
524+
525+
@Nullable
526+
private String resolveRecursively(PartResolutionContext resolutionContext) {
527+
if (!this.text().equals(this.key)) {
528+
String value = resolveRecursively(resolutionContext, this.text());
529+
if (value != null) {
530+
return value;
531+
}
532+
}
533+
return resolveRecursively(resolutionContext, this.key);
534+
}
524535
}
525536

526537

spring-core/src/test/java/org/springframework/util/PlaceholderParserTests.java

+31-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.junit.jupiter.params.ParameterizedTest;
2525
import org.junit.jupiter.params.provider.Arguments;
2626
import org.junit.jupiter.params.provider.MethodSource;
27+
import org.mockito.InOrder;
2728

2829
import org.springframework.util.PlaceholderParser.ParsedValue;
2930
import org.springframework.util.PlaceholderParser.TextPart;
@@ -33,6 +34,7 @@
3334
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3435
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3536
import static org.mockito.BDDMockito.given;
37+
import static org.mockito.Mockito.inOrder;
3638
import static org.mockito.Mockito.mock;
3739
import static org.mockito.Mockito.verify;
3840
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -220,20 +222,45 @@ static Stream<Arguments> nestedPlaceholders() {
220222
);
221223
}
222224

225+
@ParameterizedTest(name = "{0} -> {1}")
226+
@MethodSource("exactMatchPlaceholders")
227+
void placeholdersWithExactMatchAreConsidered(String text, String expected) {
228+
Properties properties = new Properties();
229+
properties.setProperty("prefix://my-service", "example-service");
230+
properties.setProperty("px", "prefix");
231+
properties.setProperty("p1", "${prefix://my-service}");
232+
assertThat(this.parser.replacePlaceholders(text, properties::getProperty)).isEqualTo(expected);
233+
}
234+
235+
static Stream<Arguments> exactMatchPlaceholders() {
236+
return Stream.of(
237+
Arguments.of("${prefix://my-service}", "example-service"),
238+
Arguments.of("${p1}", "example-service")
239+
);
240+
}
241+
242+
@Test
243+
void parseWithKeyEqualsToText() {
244+
PlaceholderResolver resolver = mockPlaceholderResolver("firstName", "Steve");
245+
assertThat(this.parser.replacePlaceholders("${firstName}", resolver))
246+
.isEqualTo("Steve");
247+
verifyPlaceholderResolutions(resolver, "firstName");
248+
}
249+
223250
@Test
224251
void parseWithHardcodedFallback() {
225252
PlaceholderResolver resolver = mockPlaceholderResolver();
226253
assertThat(this.parser.replacePlaceholders("${firstName:Steve}", resolver))
227254
.isEqualTo("Steve");
228-
verifyPlaceholderResolutions(resolver, "firstName");
255+
verifyPlaceholderResolutions(resolver, "firstName:Steve", "firstName");
229256
}
230257

231258
@Test
232259
void parseWithNestedPlaceholderInKeyUsingFallback() {
233260
PlaceholderResolver resolver = mockPlaceholderResolver("firstName", "John");
234261
assertThat(this.parser.replacePlaceholders("${first${invalid:Name}}", resolver))
235262
.isEqualTo("John");
236-
verifyPlaceholderResolutions(resolver, "invalid", "firstName");
263+
verifyPlaceholderResolutions(resolver, "invalid:Name", "invalid", "firstName");
237264
}
238265

239266
@Test
@@ -348,8 +375,9 @@ PlaceholderResolver mockPlaceholderResolver(String... pairs) {
348375
}
349376

350377
void verifyPlaceholderResolutions(PlaceholderResolver mock, String... placeholders) {
378+
InOrder ordered = inOrder(mock);
351379
for (String placeholder : placeholders) {
352-
verify(mock).resolvePlaceholder(placeholder);
380+
ordered.verify(mock).resolvePlaceholder(placeholder);
353381
}
354382
verifyNoMoreInteractions(mock);
355383
}

0 commit comments

Comments
 (0)