Add SpringApplicationErrorHandler
[#48055575] [bs-31] Add hooks for failed application context startup
This commit is contained in:
@@ -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);
|
||||
|
||||
// Create and configure the environment
|
||||
ConfigurableEnvironment environment = getOrCreateEnvironment();
|
||||
addPropertySources(environment, args);
|
||||
for (String profile : this.profiles) {
|
||||
environment.addActiveProfile(profile);
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Call all remaining initializers
|
||||
callEnvironmentAwareSpringApplicationInitializers(args, environment);
|
||||
Set<Object> sources = assembleSources();
|
||||
Assert.notEmpty(sources, "Sources must not be empty");
|
||||
if (this.showBanner) {
|
||||
printBanner();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
stopWatch.stop();
|
||||
if (this.logStartupInfo) {
|
||||
new StartupInfoLogger(this.mainApplicationClass).logStarted(
|
||||
getApplicationLog(), stopWatch);
|
||||
}
|
||||
|
||||
runCommandLineRunners(context, args);
|
||||
return context;
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user