Commit 089233e4 authored by Dave Syer's avatar Dave Syer

Add SpringApplicationErrorHandler

[#48055575] [bs-31] Add hooks for failed application context startup
parent c2204d66
...@@ -259,46 +259,68 @@ public class SpringApplication { ...@@ -259,46 +259,68 @@ public class SpringApplication {
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
stopWatch.start(); stopWatch.start();
// Call all non environment aware initializers very early try {
callNonEnvironmentAwareSpringApplicationInitializers(args);
// Create and configure the environment // Call all non environment aware initializers very early
ConfigurableEnvironment environment = getOrCreateEnvironment(); callNonEnvironmentAwareSpringApplicationInitializers(args);
addPropertySources(environment, args);
for (String profile : this.profiles) {
environment.addActiveProfile(profile);
}
// Call all remaining initializers // Create and configure the environment
callEnvironmentAwareSpringApplicationInitializers(args, environment); ConfigurableEnvironment environment = getOrCreateEnvironment();
Set<Object> sources = assembleSources(); addPropertySources(environment, args);
Assert.notEmpty(sources, "Sources must not be empty"); for (String profile : this.profiles) {
if (this.showBanner) { environment.addActiveProfile(profile);
printBanner(); }
}
// Create, load, refresh and run the ApplicationContext // Call all remaining initializers
ConfigurableApplicationContext context = createApplicationContext(); callEnvironmentAwareSpringApplicationInitializers(args, environment);
context.registerShutdownHook(); Set<Object> sources = assembleSources();
context.setEnvironment(environment); Assert.notEmpty(sources, "Sources must not be empty");
postProcessApplicationContext(context); if (this.showBanner) {
applyInitializers(context); printBanner();
if (this.logStartupInfo) { }
logStartupInfo();
} // Create, load, refresh and run the ApplicationContext
ConfigurableApplicationContext context = createApplicationContext();
context.registerShutdownHook();
context.setEnvironment(environment);
postProcessApplicationContext(context);
applyInitializers(context);
if (this.logStartupInfo) {
logStartupInfo();
}
load(context, sources.toArray(new Object[sources.size()])); load(context, sources.toArray(new Object[sources.size()]));
refresh(context); refresh(context);
stopWatch.stop(); stopWatch.stop();
if (this.logStartupInfo) { if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted( new StartupInfoLogger(this.mainApplicationClass).logStarted(
getApplicationLog(), stopWatch); getApplicationLog(), stopWatch);
}
runCommandLineRunners(context, args);
return context;
}
catch (RuntimeException e) {
handle(e, args);
throw e;
}
catch (Error e) {
handle(e, args);
throw e;
} }
runCommandLineRunners(context, args); }
return context;
private void handle(Throwable e, String... args) {
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>(
getInitializers());
Collections.reverse(initializers);
for (ApplicationContextInitializer<?> initializer : initializers) {
if (initializer instanceof SpringApplicationErrorHandler) {
((SpringApplicationErrorHandler) initializer).handle(this, args, e);
}
}
} }
private Set<Object> assembleSources() { private Set<Object> assembleSources() {
...@@ -700,8 +722,8 @@ public class SpringApplication { ...@@ -700,8 +722,8 @@ public class SpringApplication {
*/ */
public List<ApplicationContextInitializer<?>> getInitializers() { public List<ApplicationContextInitializer<?>> getInitializers() {
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>( List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>(
this.initializers); getSpringFactoriesApplicationContextInitializers());
initializers.addAll(getSpringFactoriesApplicationContextInitializers()); initializers.addAll(this.initializers);
return initializers; return initializers;
} }
......
/*
* Copyright 2012-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot;
/**
* Strategy interface that can be used to capture errors in a {@link SpringApplication}
* after it fails to start up.
*
* @author Dave Syer
*/
public interface SpringApplicationErrorHandler {
/**
* Finalize the application.
*
* @param springApplication the spring application.
* @param args the run arguments
* @param e an exception thrown during startup (or null if none)
*/
void handle(SpringApplication springApplication, String[] args, Throwable e);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment