Skip to content

Commit cb95496

Browse files
committed
AbstractApplicationContext registers default embedded value resolver
Issue: SPR-14140
1 parent 572e535 commit cb95496

File tree

4 files changed

+51
-7
lines changed

4 files changed

+51
-7
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/ConfigurableBeanFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2012 the original author or authors.
2+
* Copyright 2002-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -209,6 +209,13 @@ public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, Single
209209
*/
210210
void addEmbeddedValueResolver(StringValueResolver valueResolver);
211211

212+
/**
213+
* Determine whether an embedded value resolver has been registered with this
214+
* bean factory, to be applied through {@link #resolveEmbeddedValue(String)}.
215+
* @since 4.3
216+
*/
217+
boolean hasEmbeddedValueResolver();
218+
212219
/**
213220
* Resolve the given embedded value, e.g. an annotation attribute.
214221
* @param value the value to resolve

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2015 the original author or authors.
2+
* Copyright 2002-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -798,6 +798,11 @@ public void addEmbeddedValueResolver(StringValueResolver valueResolver) {
798798
this.embeddedValueResolvers.add(valueResolver);
799799
}
800800

801+
@Override
802+
public boolean hasEmbeddedValueResolver() {
803+
return !this.embeddedValueResolvers.isEmpty();
804+
}
805+
801806
@Override
802807
public String resolveEmbeddedValue(String value) {
803808
String result = value;

spring-context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.springframework.util.Assert;
7979
import org.springframework.util.ObjectUtils;
8080
import org.springframework.util.ReflectionUtils;
81+
import org.springframework.util.StringValueResolver;
8182

8283
/**
8384
* Abstract implementation of the {@link org.springframework.context.ApplicationContext}
@@ -825,6 +826,18 @@ protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory b
825826
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
826827
}
827828

829+
// Register a default embedded value resolver if no bean post-processor
830+
// (such as a PropertyPlaceholderConfigurer bean) registered any before:
831+
// at this point, primarily for resolution in annotation attribute values.
832+
if (!beanFactory.hasEmbeddedValueResolver()) {
833+
beanFactory.addEmbeddedValueResolver(new StringValueResolver() {
834+
@Override
835+
public String resolveStringValue(String strVal) {
836+
return getEnvironment().resolvePlaceholders(strVal);
837+
}
838+
});
839+
}
840+
828841
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
829842
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
830843
for (String weaverAwareName : weaverAwareNames) {

spring-web/src/test/java/org/springframework/web/method/annotation/RequestHeaderMethodArgumentResolverTests.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public class RequestHeaderMethodArgumentResolverTests {
5151
private MethodParameter paramNamedValueStringArray;
5252
private MethodParameter paramSystemProperty;
5353
private MethodParameter paramContextPath;
54-
private MethodParameter paramResolvedName;
54+
private MethodParameter paramResolvedNameWithExpression;
55+
private MethodParameter paramResolvedNameWithPlaceholder;
5556
private MethodParameter paramNamedValueMap;
5657

5758
private MockHttpServletRequest servletRequest;
@@ -71,8 +72,9 @@ public void setUp() throws Exception {
7172
paramNamedValueStringArray = new SynthesizingMethodParameter(method, 1);
7273
paramSystemProperty = new SynthesizingMethodParameter(method, 2);
7374
paramContextPath = new SynthesizingMethodParameter(method, 3);
74-
paramResolvedName = new SynthesizingMethodParameter(method, 4);
75-
paramNamedValueMap = new SynthesizingMethodParameter(method, 5);
75+
paramResolvedNameWithExpression = new SynthesizingMethodParameter(method, 4);
76+
paramResolvedNameWithPlaceholder = new SynthesizingMethodParameter(method, 5);
77+
paramNamedValueMap = new SynthesizingMethodParameter(method, 6);
7678

7779
servletRequest = new MockHttpServletRequest();
7880
webRequest = new ServletWebRequest(servletRequest, new MockHttpServletResponse());
@@ -135,13 +137,29 @@ public void resolveDefaultValueFromSystemProperty() throws Exception {
135137
}
136138

137139
@Test
138-
public void resolveNameFromSystemProperty() throws Exception {
140+
public void resolveNameFromSystemPropertyThroughExpression() throws Exception {
139141
String expected = "foo";
140142
servletRequest.addHeader("bar", expected);
141143

142144
System.setProperty("systemProperty", "bar");
143145
try {
144-
Object result = resolver.resolveArgument(paramResolvedName, null, webRequest, null);
146+
Object result = resolver.resolveArgument(paramResolvedNameWithExpression, null, webRequest, null);
147+
assertTrue(result instanceof String);
148+
assertEquals("Invalid result", expected, result);
149+
}
150+
finally {
151+
System.clearProperty("systemProperty");
152+
}
153+
}
154+
155+
@Test
156+
public void resolveNameFromSystemPropertyThroughPlaceholder() throws Exception {
157+
String expected = "foo";
158+
servletRequest.addHeader("bar", expected);
159+
160+
System.setProperty("systemProperty", "bar");
161+
try {
162+
Object result = resolver.resolveArgument(paramResolvedNameWithPlaceholder, null, webRequest, null);
145163
assertTrue(result instanceof String);
146164
assertEquals("Invalid result", expected, result);
147165
}
@@ -171,6 +189,7 @@ public void params(
171189
@RequestHeader(name = "name", defaultValue="#{systemProperties.systemProperty}") String param3,
172190
@RequestHeader(name = "name", defaultValue="#{request.contextPath}") String param4,
173191
@RequestHeader("#{systemProperties.systemProperty}") String param5,
192+
@RequestHeader("${systemProperty}") String param6,
174193
@RequestHeader("name") Map<?, ?> unsupported) {
175194
}
176195

0 commit comments

Comments
 (0)