Browse Source

Injected Map/Collection does not include null bean entries

Issue: SPR-17034
pull/1887/merge
Juergen Hoeller 7 years ago
parent
commit
77d72f1e01
  1. 8
      spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
  2. 9
      spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

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

@ -1318,7 +1318,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @@ -1318,7 +1318,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
DependencyDescriptor descriptor, Class<?> requiredType) {
if (descriptor instanceof MultiElementDescriptor || containsSingleton(candidateName)) {
if (descriptor instanceof MultiElementDescriptor) {
Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
if (!(beanInstance instanceof NullBean)) {
candidates.put(candidateName, beanInstance);
}
}
else if (containsSingleton(candidateName)) {
Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
candidates.put(candidateName, (beanInstance instanceof NullBean ? null : beanInstance));
}

9
spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

@ -728,9 +728,8 @@ public class AutowiredAnnotationBeanPostProcessorTests { @@ -728,9 +728,8 @@ public class AutowiredAnnotationBeanPostProcessorTests {
ConstructorsCollectionResourceInjectionBean bean = (ConstructorsCollectionResourceInjectionBean) bf.getBean("annotatedBean");
assertNull(bean.getTestBean3());
assertSame(tb, bean.getTestBean4());
assertEquals(2, bean.getNestedTestBeans().size());
assertNull(bean.getNestedTestBeans().get(0));
assertSame(ntb2, bean.getNestedTestBeans().get(1));
assertEquals(1, bean.getNestedTestBeans().size());
assertSame(ntb2, bean.getNestedTestBeans().get(0));
Map<String, NestedTestBean> map = bf.getBeansOfType(NestedTestBean.class);
assertNull(map.get("nestedTestBean1"));
@ -924,12 +923,12 @@ public class AutowiredAnnotationBeanPostProcessorTests { @@ -924,12 +923,12 @@ public class AutowiredAnnotationBeanPostProcessorTests {
bf.registerBeanDefinition("testBean2", tb2);
MapConstructorInjectionBean bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
assertEquals(2, bean.getTestBeanMap().size());
assertEquals(1, bean.getTestBeanMap().size());
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
assertNull(bean.getTestBeanMap().get("testBean2"));
bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
assertEquals(2, bean.getTestBeanMap().size());
assertEquals(1, bean.getTestBeanMap().size());
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
assertNull(bean.getTestBeanMap().get("testBean2"));
}

Loading…
Cancel
Save