Add SpringApplicationErrorHandler

[#48055575] [bs-31] Add hooks for failed application context startup
pull/118/merge
Dave Syer 11 years ago
parent c2204d6618
commit 089233e472

@ -259,46 +259,68 @@ public class SpringApplication {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// Call all non environment aware initializers very early
callNonEnvironmentAwareSpringApplicationInitializers(args);
try {
// Create and configure the environment
ConfigurableEnvironment environment = getOrCreateEnvironment();
addPropertySources(environment, args);
for (String profile : this.profiles) {
environment.addActiveProfile(profile);
}
// Call all non environment aware initializers very early
callNonEnvironmentAwareSpringApplicationInitializers(args);
// Call all remaining initializers
callEnvironmentAwareSpringApplicationInitializers(args, environment);
Set<Object> sources = assembleSources();
Assert.notEmpty(sources, "Sources must not be empty");
if (this.showBanner) {
printBanner();
}
// Create and configure the environment
ConfigurableEnvironment environment = getOrCreateEnvironment();
addPropertySources(environment, args);
for (String profile : this.profiles) {
environment.addActiveProfile(profile);
}
// Create, load, refresh and run the ApplicationContext
ConfigurableApplicationContext context = createApplicationContext();
context.registerShutdownHook();
context.setEnvironment(environment);
postProcessApplicationContext(context);
applyInitializers(context);
if (this.logStartupInfo) {
logStartupInfo();
}
// Call all remaining initializers
callEnvironmentAwareSpringApplicationInitializers(args, environment);
Set<Object> sources = assembleSources();
Assert.notEmpty(sources, "Sources must not be empty");
if (this.showBanner) {
printBanner();
}
// 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()]));
refresh(context);
load(context, sources.toArray(new Object[sources.size()]));
refresh(context);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(
getApplicationLog(), stopWatch);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(
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() {
@ -700,8 +722,8 @@ public class SpringApplication {
*/
public List<ApplicationContextInitializer<?>> getInitializers() {
List<ApplicationContextInitializer<?>> initializers = new ArrayList<ApplicationContextInitializer<?>>(
this.initializers);
initializers.addAll(getSpringFactoriesApplicationContextInitializers());
getSpringFactoriesApplicationContextInitializers());
initializers.addAll(this.initializers);
return initializers;
}

@ -0,0 +1,36 @@
/*
* 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);
}
Loading…
Cancel
Save