Skip to content

Commit f3ff98d

Browse files
committed
Allow nulls with multiple embedded value resolvers
Allow an embedded value resolver added to an AbstractBeanFactory to return null without adversely effecting any subsequent resolvers. Issue: SPR-8565
1 parent 9982b4c commit f3ff98d

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ public void addEmbeddedValueResolver(StringValueResolver valueResolver) {
746746
public String resolveEmbeddedValue(String value) {
747747
String result = value;
748748
for (StringValueResolver resolver : this.embeddedValueResolvers) {
749-
result = resolver.resolveStringValue(result);
749+
result = (result == null ? null : resolver.resolveStringValue(result));
750750
}
751751
return result;
752752
}

spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
import static org.junit.Assert.assertThat;
2929
import static org.junit.Assert.assertTrue;
3030
import static org.junit.Assert.fail;
31+
import static org.mockito.BDDMockito.given;
32+
import static org.mockito.Matchers.isNull;
33+
import static org.mockito.Mockito.mock;
34+
import static org.mockito.Mockito.never;
35+
import static org.mockito.Mockito.verify;
3136

3237
import java.io.Closeable;
3338
import java.lang.reflect.Field;
@@ -97,6 +102,7 @@
97102
import org.springframework.tests.sample.beans.TestBean;
98103
import org.springframework.tests.sample.beans.factory.DummyFactory;
99104
import org.springframework.util.StopWatch;
105+
import org.springframework.util.StringValueResolver;
100106

101107
/**
102108
* Tests properties population and autowire behavior.
@@ -2261,6 +2267,26 @@ public void testContainsBeanReturnsTrueEvenForAbstractBeanDefinition() {
22612267
assertThat(bf.containsBean("bogus"), is(false));
22622268
}
22632269

2270+
@Test
2271+
public void resolveEmbeddedValue() throws Exception {
2272+
DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
2273+
StringValueResolver r1 = mock(StringValueResolver.class);
2274+
StringValueResolver r2 = mock(StringValueResolver.class);
2275+
StringValueResolver r3 = mock(StringValueResolver.class);
2276+
bf.addEmbeddedValueResolver(r1);
2277+
bf.addEmbeddedValueResolver(r2);
2278+
bf.addEmbeddedValueResolver(r3);
2279+
given(r1.resolveStringValue("A")).willReturn("B");
2280+
given(r2.resolveStringValue("B")).willReturn(null);
2281+
given(r3.resolveStringValue(isNull(String.class))).willThrow(new IllegalArgumentException());
2282+
2283+
bf.resolveEmbeddedValue("A");
2284+
2285+
verify(r1).resolveStringValue("A");
2286+
verify(r2).resolveStringValue("B");
2287+
verify(r3, never()).resolveStringValue(isNull(String.class));
2288+
}
2289+
22642290

22652291
static class A { }
22662292
static class B { }

0 commit comments

Comments
 (0)