Injected Map/Collection does not include null bean entries
Issue: SPR-17034
This commit is contained in:
parent
faef363e85
commit
77d72f1e01
|
|
@ -1318,7 +1318,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||||
private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
|
private void addCandidateEntry(Map<String, Object> candidates, String candidateName,
|
||||||
DependencyDescriptor descriptor, Class<?> requiredType) {
|
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);
|
Object beanInstance = descriptor.resolveCandidate(candidateName, requiredType, this);
|
||||||
candidates.put(candidateName, (beanInstance instanceof NullBean ? null : beanInstance));
|
candidates.put(candidateName, (beanInstance instanceof NullBean ? null : beanInstance));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -728,9 +728,8 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
ConstructorsCollectionResourceInjectionBean bean = (ConstructorsCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
ConstructorsCollectionResourceInjectionBean bean = (ConstructorsCollectionResourceInjectionBean) bf.getBean("annotatedBean");
|
||||||
assertNull(bean.getTestBean3());
|
assertNull(bean.getTestBean3());
|
||||||
assertSame(tb, bean.getTestBean4());
|
assertSame(tb, bean.getTestBean4());
|
||||||
assertEquals(2, bean.getNestedTestBeans().size());
|
assertEquals(1, bean.getNestedTestBeans().size());
|
||||||
assertNull(bean.getNestedTestBeans().get(0));
|
assertSame(ntb2, bean.getNestedTestBeans().get(0));
|
||||||
assertSame(ntb2, bean.getNestedTestBeans().get(1));
|
|
||||||
|
|
||||||
Map<String, NestedTestBean> map = bf.getBeansOfType(NestedTestBean.class);
|
Map<String, NestedTestBean> map = bf.getBeansOfType(NestedTestBean.class);
|
||||||
assertNull(map.get("nestedTestBean1"));
|
assertNull(map.get("nestedTestBean1"));
|
||||||
|
|
@ -924,12 +923,12 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
bf.registerBeanDefinition("testBean2", tb2);
|
bf.registerBeanDefinition("testBean2", tb2);
|
||||||
|
|
||||||
MapConstructorInjectionBean bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
|
MapConstructorInjectionBean bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
|
||||||
assertEquals(2, bean.getTestBeanMap().size());
|
assertEquals(1, bean.getTestBeanMap().size());
|
||||||
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
|
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
|
||||||
assertNull(bean.getTestBeanMap().get("testBean2"));
|
assertNull(bean.getTestBeanMap().get("testBean2"));
|
||||||
|
|
||||||
bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
|
bean = (MapConstructorInjectionBean) bf.getBean("annotatedBean");
|
||||||
assertEquals(2, bean.getTestBeanMap().size());
|
assertEquals(1, bean.getTestBeanMap().size());
|
||||||
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
|
assertSame(tb1, bean.getTestBeanMap().get("testBean1"));
|
||||||
assertNull(bean.getTestBeanMap().get("testBean2"));
|
assertNull(bean.getTestBeanMap().get("testBean2"));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue