Skip to content

Commit f3b0d5a

Browse files
committed
Correct handling of beans with null definitions when finding matches
Fixes gh-48117
1 parent f8d493f commit f3b0d5a

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,19 @@ private Map<String, BeanDefinition> getBeanDefinitions(ConfigurableListableBeanF
471471
}
472472

473473
private List<String> getPrimaryBeans(Map<String, BeanDefinition> beanDefinitions) {
474-
return getMatchingBeans(beanDefinitions, BeanDefinition::isPrimary);
474+
return getMatchingBeans(beanDefinitions, this::isPrimary);
475+
}
476+
477+
private boolean isPrimary(BeanDefinition beanDefinition) {
478+
return (beanDefinition != null) && beanDefinition.isPrimary();
475479
}
476480

477481
private List<String> getNonFallbackBeans(Map<String, BeanDefinition> beanDefinitions) {
478-
return getMatchingBeans(beanDefinitions, Predicate.not(BeanDefinition::isFallback));
482+
return getMatchingBeans(beanDefinitions, this::isNotFallback);
483+
}
484+
485+
private boolean isNotFallback(BeanDefinition beanDefinition) {
486+
return (beanDefinition == null) || !beanDefinition.isFallback();
479487
}
480488

481489
private List<String> getMatchingBeans(Map<String, BeanDefinition> beanDefinitions, Predicate<BeanDefinition> test) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidateTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,16 @@ void singleCandidateMultipleCandidatesOneDefaultCandidate() {
195195
});
196196
}
197197

198+
@Test
199+
void singleCandidateDoesNotMatchWhenMultipleRegisteredAsSingletonCandidates() {
200+
this.contextRunner.withInitializer((context) -> {
201+
context.getBeanFactory().registerSingleton("alpha", "alpha");
202+
context.getBeanFactory().registerSingleton("bravo", "bravo");
203+
})
204+
.withUserConfiguration(OnBeanSingleCandidateConfiguration.class)
205+
.run((context) -> assertThat(context).doesNotHaveBean("consumer"));
206+
}
207+
198208
@Configuration(proxyBeanMethods = false)
199209
@ConditionalOnSingleCandidate(String.class)
200210
static class OnBeanSingleCandidateConfiguration {

0 commit comments

Comments
 (0)