From 4610724423152e4f11c2a61c58b91baa28faf06d Mon Sep 17 00:00:00 2001 From: Kyle Anderson Date: Thu, 22 Mar 2018 17:04:23 -0700 Subject: [PATCH] Improve NoSuchBeanDefinitionException to include a reference to the dependent bean Issue: SPR-16628 --- .../factory/NoSuchBeanDefinitionException.java | 15 ++++++++++++++- .../factory/support/AbstractBeanFactory.java | 13 ++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/NoSuchBeanDefinitionException.java b/spring-beans/src/main/java/org/springframework/beans/factory/NoSuchBeanDefinitionException.java index 539b2534248d..71f1e3127369 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/NoSuchBeanDefinitionException.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/NoSuchBeanDefinitionException.java @@ -41,6 +41,9 @@ public class NoSuchBeanDefinitionException extends BeansException { @Nullable private ResolvableType resolvableType; + @Nullable + private ResolvableType dependentBeanType; + /** * Create a new {@code NoSuchBeanDefinitionException}. @@ -61,6 +64,12 @@ public NoSuchBeanDefinitionException(String name, String message) { this.beanName = name; } + public NoSuchBeanDefinitionException(String name, ResolvableType dependentBeanType) { + super("'" + dependentBeanType + "' depends on a bean named '" + name + "' but it wasn't available"); + this.beanName = name; + this.dependentBeanType = dependentBeanType; + } + /** * Create a new {@code NoSuchBeanDefinitionException}. * @param type required type of the missing bean @@ -99,7 +108,6 @@ public NoSuchBeanDefinitionException(ResolvableType type, String message) { this.resolvableType = type; } - /** * Return the name of the missing bean, if it was a lookup by name that failed. */ @@ -136,4 +144,9 @@ public int getNumberOfBeansFound() { return 0; } + @Nullable + public ResolvableType getDependentBeanType() { + return this.dependentBeanType; + } + } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 6f5a392c6a64..188d0a1b669b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -300,7 +300,18 @@ else if (args != null) { "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } registerDependentBean(dep, beanName); - getBean(dep); + try { + getBean(dep); + }catch(NoSuchBeanDefinitionException ex) { + Class dependentClass = null; + try { + dependentClass = Class.forName(mbd.getBeanClassName()); + } + catch (ClassNotFoundException e) {} //swallow + finally { + throw new NoSuchBeanDefinitionException(dep, ResolvableType.forClass(dependentClass)); + } + } } }