Skip to content

Commit da3fd5c

Browse files
committed
Merge branch '4.0.x'
Closes gh-49732
2 parents fe8fcae + 4694f6f commit da3fd5c

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

core/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigDataEnvironment.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.boot.context.config;
1818

1919
import java.util.ArrayList;
20-
import java.util.Arrays;
2120
import java.util.Collection;
2221
import java.util.Collections;
2322
import java.util.LinkedHashSet;
@@ -201,22 +200,23 @@ ConfigDataEnvironmentContributors getContributors() {
201200

202201
private List<ConfigDataEnvironmentContributor> getInitialImportContributors(Binder binder) {
203202
List<ConfigDataEnvironmentContributor> initialContributors = new ArrayList<>();
204-
addInitialImportContributors(initialContributors, bindLocations(binder, IMPORT_PROPERTY, EMPTY_LOCATIONS));
205-
addInitialImportContributors(initialContributors,
206-
bindLocations(binder, ADDITIONAL_LOCATION_PROPERTY, EMPTY_LOCATIONS));
207-
addInitialImportContributors(initialContributors,
208-
bindLocations(binder, LOCATION_PROPERTY, DEFAULT_SEARCH_LOCATIONS));
203+
addInitialImportContributors(initialContributors, binder, IMPORT_PROPERTY, EMPTY_LOCATIONS, false);
204+
addInitialImportContributors(initialContributors, binder, ADDITIONAL_LOCATION_PROPERTY, EMPTY_LOCATIONS, true);
205+
addInitialImportContributors(initialContributors, binder, LOCATION_PROPERTY, DEFAULT_SEARCH_LOCATIONS, true);
209206
return initialContributors;
210207
}
211208

212-
private ConfigDataLocation[] bindLocations(Binder binder, String propertyName, ConfigDataLocation[] other) {
213-
return binder.bind(propertyName, CONFIG_DATA_LOCATION_ARRAY).orElse(other);
214-
}
215-
216-
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,
217-
ConfigDataLocation[] locations) {
218-
addInitialImportContributors(initialContributors,
219-
Arrays.stream(locations).filter(ConfigDataLocation::isNotEmpty).toList());
209+
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors, Binder binder,
210+
String propertyName, ConfigDataLocation[] defaultValue, boolean registerIndividually) {
211+
ConfigDataLocation[] locations = binder.bind(propertyName, CONFIG_DATA_LOCATION_ARRAY).orElse(defaultValue);
212+
if (registerIndividually) {
213+
for (int i = locations.length - 1; i >= 0; i--) {
214+
addInitialImportContributors(initialContributors, List.of(locations[i]));
215+
}
216+
}
217+
else {
218+
addInitialImportContributors(initialContributors, List.of(locations));
219+
}
220220
}
221221

222222
private void addInitialImportContributors(List<ConfigDataEnvironmentContributor> initialContributors,

core/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentTests.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.io.IOException;
2020
import java.net.URL;
21+
import java.nio.file.Files;
22+
import java.nio.file.Path;
2123
import java.util.Collection;
2224
import java.util.Collections;
2325
import java.util.Enumeration;
@@ -30,6 +32,7 @@
3032
import org.jspecify.annotations.Nullable;
3133
import org.junit.jupiter.api.Test;
3234
import org.junit.jupiter.api.TestInfo;
35+
import org.junit.jupiter.api.io.TempDir;
3336
import org.junit.jupiter.params.ParameterizedTest;
3437
import org.junit.jupiter.params.provider.ValueSource;
3538

@@ -146,7 +149,7 @@ void createCreatesInitialImportContributorsInCorrectOrder() {
146149
.map(ConfigDataEnvironmentContributor::getImports)
147150
.map(Object::toString)
148151
.toArray();
149-
assertThat(imports).containsExactly("[i1, i2]", "[a1, a2]", "[l1, l2]");
152+
assertThat(imports).containsExactly("[i1, i2]", "[a2]", "[a1]", "[l2]", "[l1]");
150153
}
151154

152155
@Test
@@ -382,6 +385,19 @@ public Enumeration<URL> getResources(String name) throws IOException {
382385
.containsOnly(SeparateClassLoaderConfigDataLoader.class);
383386
}
384387

388+
@Test // gh-49724
389+
@WithResource(name = "application-local.properties", content = "test.property=classpath-local")
390+
void processAndApplyWhenExternalFileConfigOverridesProfileSpecificClasspathConfig(@TempDir Path tempDir)
391+
throws IOException {
392+
Files.writeString(tempDir.resolve("application.properties"), "test.property=file-default\n");
393+
this.environment.setProperty("spring.config.location",
394+
"optional:classpath:/,optional:file:" + tempDir.toAbsolutePath() + "/");
395+
ConfigDataEnvironment configDataEnvironment = new ConfigDataEnvironment(this.logFactory, this.bootstrapContext,
396+
this.environment, this.resourceLoader, List.of("local"), null);
397+
configDataEnvironment.processAndApply();
398+
assertThat(this.environment.getProperty("test.property")).isEqualTo("file-default");
399+
}
400+
385401
private String getConfigLocation(TestInfo info) {
386402
return "optional:classpath:" + info.getTestClass().get().getName().replace('.', '/') + "-"
387403
+ info.getTestMethod().get().getName() + ".properties";

0 commit comments

Comments
 (0)