Don't mask original exception in SpringApplication.handleError

If any @Import (or @Enable*, especially @EnableScheduling) has registered
bean *names* as ApplicationListeners, and the application context wasn't
refreshed fully when it failed, then the listener lookup could fail and
mask the original exception

Fixes gh-253
This commit is contained in:
Dave Syer 2014-01-23 10:19:06 +00:00
parent a55809959f
commit dac1b53fda
2 changed files with 17 additions and 4 deletions

View File

@ -25,6 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.PoolConfig;
@ -46,6 +47,7 @@ import com.lambdaworks.redis.RedisClient;
*/
@Configuration
@ConditionalOnClass({ LettuceConnection.class, RedisOperations.class, RedisClient.class })
@EnableConfigurationProperties
public class RedisAutoConfiguration {
@Configuration

View File

@ -376,8 +376,19 @@ public class SpringApplication {
protected void handleError(ConfigurableApplicationContext context,
ApplicationEventMulticaster multicaster, Throwable ex, String... args) {
multicaster.multicastEvent(new SpringApplicationErrorEvent(this, context, args,
ex));
try {
multicaster.multicastEvent(new SpringApplicationErrorEvent(this, context,
args, ex));
}
catch (Exception e) {
// We don't want to fail here and mask the original exception
if (this.log.isDebugEnabled()) {
this.log.error("Error handling failed", e);
}
else {
this.log.warn("Error handling failed (" + e.getMessage() + ")");
}
}
if (context != null) {
context.close();
}
@ -1004,8 +1015,8 @@ public class SpringApplication {
@Override
protected Collection<ApplicationListener<?>> getApplicationListeners(
ApplicationEvent event) {
List<ApplicationListener<?>> listeners = new ArrayList<ApplicationListener<?>>(
super.getApplicationListeners(event));
List<ApplicationListener<?>> listeners = new ArrayList<ApplicationListener<?>>();
listeners.addAll(super.getApplicationListeners(event));
if (event instanceof SpringApplicationErrorEvent) {
Collections.reverse(listeners);
}