From 927346144cdf1976b93f7bff3fa494a1567f40ea Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 19 May 2010 19:44:57 +0000 Subject: [PATCH] refined LifecycleProcessor exception handling, properly wrapping a start exception from a bean (SPR-7106) git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3353 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../context/support/AbstractApplicationContext.java | 9 +++++++-- .../context/support/DefaultLifecycleProcessor.java | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java index ef52fd34649..57ddcd958a2 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java +++ b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java @@ -1007,11 +1007,16 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader publishEvent(new ContextClosedEvent(this)); } catch (Throwable ex) { - logger.error("Exception thrown from ApplicationListener handling ContextClosedEvent", ex); + logger.warn("Exception thrown from ApplicationListener handling ContextClosedEvent", ex); } // Stop all Lifecycle beans, to avoid delays during individual destruction. - getLifecycleProcessor().onClose(); + try { + getLifecycleProcessor().onClose(); + } + catch (Throwable ex) { + logger.warn("Exception thrown from LifecycleProcessor on context close", ex); + } // Destroy all cached singletons in the context's BeanFactory. destroyBeans(); diff --git a/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java b/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java index ba1f4e6a49d..3ddbd953e8f 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java +++ b/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java @@ -34,6 +34,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContextException; import org.springframework.context.Lifecycle; import org.springframework.context.LifecycleProcessor; import org.springframework.context.Phased; @@ -161,7 +162,12 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor if (logger.isDebugEnabled()) { logger.debug("Starting bean '" + beanName + "' of type [" + bean.getClass() + "]"); } - bean.start(); + try { + bean.start(); + } + catch (Throwable ex) { + throw new ApplicationContextException("Failed to start bean '" + beanName + "'", ex); + } if (logger.isDebugEnabled()) { logger.debug("Successfully started bean '" + beanName + "'"); }