Skip to content

Commit 1c5fb9a

Browse files
committed
Defensively catch NoSuchBeanDefinitionException on beanDefinitionNames traversal
Closes gh-22263 (cherry picked from commit 30bc5e0)
1 parent d841af4 commit 1c5fb9a

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

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

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,9 @@ private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSi
550550
}
551551
onSuppressedException(ex);
552552
}
553+
catch (NoSuchBeanDefinitionException ex) {
554+
// Bean definition got removed while we were iterating -> ignore.
555+
}
553556
}
554557
}
555558

@@ -638,7 +641,7 @@ public <T> Map<String, T> getBeansOfType(
638641
public String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType) {
639642
List<String> result = new ArrayList<>();
640643
for (String beanName : this.beanDefinitionNames) {
641-
BeanDefinition beanDefinition = getBeanDefinition(beanName);
644+
BeanDefinition beanDefinition = this.beanDefinitionMap.get(beanName);
642645
if (!beanDefinition.isAbstract() && findAnnotationOnBean(beanName, annotationType) != null) {
643646
result.add(beanName);
644647
}
@@ -1684,18 +1687,23 @@ private void raiseNoMatchingBeanFound(
16841687
*/
16851688
private void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor descriptor) {
16861689
for (String beanName : this.beanDefinitionNames) {
1687-
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
1688-
Class<?> targetType = mbd.getTargetType();
1689-
if (targetType != null && type.isAssignableFrom(targetType) &&
1690-
isAutowireCandidate(beanName, mbd, descriptor, getAutowireCandidateResolver())) {
1691-
// Probably a proxy interfering with target type match -> throw meaningful exception.
1692-
Object beanInstance = getSingleton(beanName, false);
1693-
Class<?> beanType = (beanInstance != null && beanInstance.getClass() != NullBean.class ?
1694-
beanInstance.getClass() : predictBeanType(beanName, mbd));
1695-
if (beanType != null && !type.isAssignableFrom(beanType)) {
1696-
throw new BeanNotOfRequiredTypeException(beanName, type, beanType);
1690+
try {
1691+
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
1692+
Class<?> targetType = mbd.getTargetType();
1693+
if (targetType != null && type.isAssignableFrom(targetType) &&
1694+
isAutowireCandidate(beanName, mbd, descriptor, getAutowireCandidateResolver())) {
1695+
// Probably a proxy interfering with target type match -> throw meaningful exception.
1696+
Object beanInstance = getSingleton(beanName, false);
1697+
Class<?> beanType = (beanInstance != null && beanInstance.getClass() != NullBean.class ?
1698+
beanInstance.getClass() : predictBeanType(beanName, mbd));
1699+
if (beanType != null && !type.isAssignableFrom(beanType)) {
1700+
throw new BeanNotOfRequiredTypeException(beanName, type, beanType);
1701+
}
16971702
}
16981703
}
1704+
catch (NoSuchBeanDefinitionException ex) {
1705+
// Bean definition got removed while we were iterating -> ignore.
1706+
}
16991707
}
17001708

17011709
BeanFactory parent = getParentBeanFactory();

0 commit comments

Comments
 (0)