diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index 704a160e558..abfeacb4445 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -461,11 +461,19 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat } private List getPrimaryBeans(Map beanDefinitions) { - return getMatchingBeans(beanDefinitions, BeanDefinition::isPrimary); + return getMatchingBeans(beanDefinitions, this::isPrimary); + } + + private boolean isPrimary(BeanDefinition beanDefinition) { + return (beanDefinition != null) && beanDefinition.isPrimary(); } private List getNonFallbackBeans(Map beanDefinitions) { - return getMatchingBeans(beanDefinitions, Predicate.not(BeanDefinition::isFallback)); + return getMatchingBeans(beanDefinitions, this::isNotFallback); + } + + private boolean isNotFallback(BeanDefinition beanDefinition) { + return (beanDefinition == null) || !beanDefinition.isFallback(); } private List getMatchingBeans(Map beanDefinitions, Predicate test) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidateTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidateTests.java index c0ac2611ed0..99f29f86759 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidateTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidateTests.java @@ -195,6 +195,16 @@ class ConditionalOnSingleCandidateTests { }); } + @Test + void singleCandidateDoesNotMatchWhenMultipleRegisteredAsSingletonCandidates() { + this.contextRunner.withInitializer((context) -> { + context.getBeanFactory().registerSingleton("alpha", "alpha"); + context.getBeanFactory().registerSingleton("bravo", "bravo"); + }) + .withUserConfiguration(OnBeanSingleCandidateConfiguration.class) + .run((context) -> assertThat(context).doesNotHaveBean("consumer")); + } + @Configuration(proxyBeanMethods = false) @ConditionalOnSingleCandidate(String.class) static class OnBeanSingleCandidateConfiguration {