Always obtain fresh PropertySources in ConfigurableEnvironmentPropertySource

Although it's unlikely that the implementation of getPropertySources()
in a ConfigurableEnvironment would be overridden to return a different
MutablePropertySources instance than the one that the
ConfigurableEnvironment typically acts on, it is in fact possible.

In light of that possibility, this commit refactors
ConfigurableEnvironmentPropertySource so that it always obtains a fresh
PropertySources reference.

See gh-34861
This commit is contained in:
Sam Brannen 2025-05-11 15:26:50 +02:00
parent 65e30132f3
commit 7135527765
1 changed files with 3 additions and 7 deletions

View File

@ -227,19 +227,15 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
*/
private static class ConfigurableEnvironmentPropertySource extends PropertySource<ConfigurableEnvironment> {
private final PropertySources propertySources;
ConfigurableEnvironmentPropertySource(ConfigurableEnvironment environment) {
super(ENVIRONMENT_PROPERTIES_PROPERTY_SOURCE_NAME, environment);
this.propertySources = environment.getPropertySources();
}
@Override
@Nullable
public Object getProperty(String name) {
for (PropertySource<?> propertySource : this.propertySources) {
for (PropertySource<?> propertySource : super.source.getPropertySources()) {
Object candidate = propertySource.getProperty(name);
if (candidate != null) {
return candidate;
@ -250,7 +246,7 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
@Override
public boolean containsProperty(String name) {
for (PropertySource<?> propertySource : this.propertySources) {
for (PropertySource<?> propertySource : super.source.getPropertySources()) {
if (propertySource.containsProperty(name)) {
return true;
}
@ -260,7 +256,7 @@ public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerS
@Override
public String toString() {
return "ConfigurableEnvironmentPropertySource {propertySources=" + this.propertySources + "}";
return "ConfigurableEnvironmentPropertySource {propertySources=" + super.source.getPropertySources() + "}";
}
}