diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java index e3dc03c76c2..f5152e0f78c 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainer.java @@ -104,7 +104,7 @@ public class JettyEmbeddedServletContainer implements EmbeddedServletContainer { this.server.start(); this.server.setStopAtShutdown(false); } - catch (Exception ex) { + catch (Throwable ex) { // Ensure process isn't left running stopSilently(); throw new EmbeddedServletContainerException( diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java index 6e2748f26da..5860e0db474 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactory.java @@ -368,6 +368,7 @@ public class JettyEmbeddedServletContainerFactory Configuration[] configurations = getWebAppContextConfigurations(context, initializersToUse); context.setConfigurations(configurations); + context.setThrowUnavailableOnStartupException(true); configureSession(context); postProcessWebAppContext(context); } diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java index 0d4ac07ab4f..6268d874096 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/jetty/JettyEmbeddedServletContainerFactoryTests.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.net.InetAddress; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Collection; import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -28,6 +29,8 @@ import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -369,6 +372,42 @@ public class JettyEmbeddedServletContainerFactoryTests } } + @Test + public void faultyListenerCausesStartFailure() throws Exception { + JettyEmbeddedServletContainerFactory factory = getFactory(); + factory.addServerCustomizers(new JettyServerCustomizer() { + + @Override + public void customize(Server server) { + Collection contexts = server.getBeans(WebAppContext.class); + contexts.iterator().next().addEventListener(new ServletContextListener() { + + @Override + public void contextInitialized(ServletContextEvent sce) { + throw new RuntimeException(); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + + } + }); + } + + }); + this.thrown.expect(EmbeddedServletContainerException.class); + JettyEmbeddedServletContainer jettyContainer = (JettyEmbeddedServletContainer) factory + .getEmbeddedServletContainer(); + try { + jettyContainer.start(); + } + finally { + QueuedThreadPool threadPool = (QueuedThreadPool) jettyContainer.getServer() + .getThreadPool(); + assertThat(threadPool.isRunning()).isFalse(); + } + } + @Test public void startFailsWhenThreadPoolIsTooSmall() throws Exception { JettyEmbeddedServletContainerFactory factory = getFactory();