diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/support/ErrorPageFilterConfiguration.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/support/ErrorPageFilterConfiguration.java index 333d93a8c42..d019d4c295b 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/support/ErrorPageFilterConfiguration.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/support/ErrorPageFilterConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -16,6 +16,9 @@ package org.springframework.boot.web.servlet.support; +import javax.servlet.DispatcherType; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,4 +35,11 @@ class ErrorPageFilterConfiguration { return new ErrorPageFilter(); } + @Bean + FilterRegistrationBean errorPageFilterRegistration(ErrorPageFilter filter) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(filter); + registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC); + return registration; + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/support/SpringBootServletInitializerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/support/SpringBootServletInitializerTests.java index 514490070f7..9cc25f4d9e5 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/support/SpringBootServletInitializerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/support/SpringBootServletInitializerTests.java @@ -17,9 +17,12 @@ package org.springframework.boot.web.servlet.support; import java.util.Collections; +import java.util.EnumSet; +import java.util.Map; import java.util.Vector; import java.util.concurrent.atomic.AtomicBoolean; +import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; @@ -37,6 +40,7 @@ import org.springframework.boot.testsupport.system.CapturedOutput; import org.springframework.boot.testsupport.system.OutputCaptureExtension; import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.server.WebServer; +import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; @@ -129,6 +133,28 @@ class SpringBootServletInitializerTests { } } + @Test + @SuppressWarnings("rawtypes") + void errorPageFilterIsRegisteredForRequestAndAsyncDispatch() { + WebServer webServer = new UndertowServletWebServerFactory(0).getWebServer((servletContext) -> { + try (AbstractApplicationContext context = (AbstractApplicationContext) new WithErrorPageFilter() + .createRootApplicationContext(servletContext)) { + Map registrations = context + .getBeansOfType(FilterRegistrationBean.class); + assertThat(registrations).hasSize(1); + FilterRegistrationBean errorPageFilterRegistration = registrations.get("errorPageFilterRegistration"); + assertThat(errorPageFilterRegistration).hasFieldOrPropertyWithValue("dispatcherTypes", + EnumSet.of(DispatcherType.ASYNC, DispatcherType.REQUEST)); + } + }); + try { + webServer.start(); + } + finally { + webServer.stop(); + } + } + @Test void executableWarThatUsesServletInitializerDoesNotHaveErrorPageFilterConfigured() { try (ConfigurableApplicationContext context = new SpringApplication(ExecutableWar.class).run()) { @@ -237,6 +263,11 @@ class SpringBootServletInitializerTests { } + @Configuration(proxyBeanMethods = false) + static class WithErrorPageFilter extends SpringBootServletInitializer { + + } + @Configuration(proxyBeanMethods = false) static class ExecutableWar extends SpringBootServletInitializer {