From 77d72f1e0164c1004abd15f01422bcc380afbb75 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 16 Jul 2018 13:04:38 +0200 Subject: [PATCH] Injected Map/Collection does not include null bean entries Issue: SPR-17034 --- .../factory/support/DefaultListableBeanFactory.java | 8 +++++++- .../AutowiredAnnotationBeanPostProcessorTests.java | 9 ++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java index 4077477ac6d..e20bfbf3a83 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java @@ -1318,7 +1318,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto private void addCandidateEntry(Map 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)); } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index cca9bdbb1fe..5bc2dc1289f 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -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 map = bf.getBeansOfType(NestedTestBean.class); assertNull(map.get("nestedTestBean1")); @@ -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")); }