Skip to content

Commit 824ffce

Browse files
committed
Defensively catch NoSuchBeanDefinitionException on beanDefinitionNames traversal
Closes gh-22263 (cherry picked from commit 30bc5e0)
1 parent 04a2cd4 commit 824ffce

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
@@ -454,6 +454,9 @@ private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSi
454454
}
455455
onSuppressedException(ex);
456456
}
457+
catch (NoSuchBeanDefinitionException ex) {
458+
// Bean definition got removed while we were iterating -> ignore.
459+
}
457460
}
458461
}
459462

@@ -540,7 +543,7 @@ public <T> Map<String, T> getBeansOfType(
540543
public String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType) {
541544
List<String> result = new ArrayList<>();
542545
for (String beanName : this.beanDefinitionNames) {
543-
BeanDefinition beanDefinition = getBeanDefinition(beanName);
546+
BeanDefinition beanDefinition = this.beanDefinitionMap.get(beanName);
544547
if (!beanDefinition.isAbstract() && findAnnotationOnBean(beanName, annotationType) != null) {
545548
result.add(beanName);
546549
}
@@ -1511,18 +1514,23 @@ private void raiseNoMatchingBeanFound(
15111514
*/
15121515
private void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor descriptor) {
15131516
for (String beanName : this.beanDefinitionNames) {
1514-
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
1515-
Class<?> targetType = mbd.getTargetType();
1516-
if (targetType != null && type.isAssignableFrom(targetType) &&
1517-
isAutowireCandidate(beanName, mbd, descriptor, getAutowireCandidateResolver())) {
1518-
// Probably a proxy interfering with target type match -> throw meaningful exception.
1519-
Object beanInstance = getSingleton(beanName, false);
1520-
Class<?> beanType = (beanInstance != null && beanInstance.getClass() != NullBean.class ?
1521-
beanInstance.getClass() : predictBeanType(beanName, mbd));
1522-
if (beanType != null && !type.isAssignableFrom(beanType)) {
1523-
throw new BeanNotOfRequiredTypeException(beanName, type, beanType);
1517+
try {
1518+
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
1519+
Class<?> targetType = mbd.getTargetType();
1520+
if (targetType != null && type.isAssignableFrom(targetType) &&
1521+
isAutowireCandidate(beanName, mbd, descriptor, getAutowireCandidateResolver())) {
1522+
// Probably a proxy interfering with target type match -> throw meaningful exception.
1523+
Object beanInstance = getSingleton(beanName, false);
1524+
Class<?> beanType = (beanInstance != null && beanInstance.getClass() != NullBean.class ?
1525+
beanInstance.getClass() : predictBeanType(beanName, mbd));
1526+
if (beanType != null && !type.isAssignableFrom(beanType)) {
1527+
throw new BeanNotOfRequiredTypeException(beanName, type, beanType);
1528+
}
15241529
}
15251530
}
1531+
catch (NoSuchBeanDefinitionException ex) {
1532+
// Bean definition got removed while we were iterating -> ignore.
1533+
}
15261534
}
15271535

15281536
BeanFactory parent = getParentBeanFactory();

0 commit comments

Comments
 (0)