Prevent ErrorPageFilter from being used if SBServletInitializer is used
Previously, the configuration class that produces the ErrorPageFilter bean was an inner class of SpringBootServletInitializer. As a result, whenever SpringBootServletInitializer was subclasses, the ErrorPageFilter would be used. This adversely affected applications running as an executable war file and those deployed to a container with error page filter registration disabled. This commit makes ErrorPageFilterConfiguration a top-level class so that it is no longer always found via SpringBootServletInitializer. The test that verifies that error page filter registration can be disabled has been updated to more accurately simulate the behaviour when an application is deployed as a war to a standalone container. A test that mimics the behaviour of an application run as an executable war has also been added. Closes gh-8477
This commit is contained in:
parent
d74af04724
commit
6381a07c71
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright 2012-2017 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.web.support;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* Configuration for {@link ErrorPageFilter}.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@Configuration
|
||||
class ErrorPageFilterConfiguration {
|
||||
|
||||
@Bean
|
||||
public ErrorPageFilter errorPageFilter() {
|
||||
return new ErrorPageFilter();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -31,7 +31,6 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
|
|||
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext;
|
||||
import org.springframework.boot.web.servlet.ServletContextInitializer;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.annotation.AnnotationUtils;
|
||||
import org.springframework.util.Assert;
|
||||
|
|
@ -175,17 +174,4 @@ public abstract class SpringBootServletInitializer implements WebApplicationInit
|
|||
return builder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuration for {@link ErrorPageFilter}.
|
||||
*/
|
||||
@Configuration
|
||||
static class ErrorPageFilterConfiguration {
|
||||
|
||||
@Bean
|
||||
public ErrorPageFilter errorPageFilter() {
|
||||
return new ErrorPageFilter();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 2012-2016 the original author or authors.
|
||||
* Copyright 2012-2017 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.
|
||||
|
|
@ -17,6 +17,7 @@
|
|||
package org.springframework.boot.web.support;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
|
@ -25,8 +26,14 @@ import org.junit.rules.ExpectedException;
|
|||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.web.support.SpringBootServletInitializer.ErrorPageFilterConfiguration;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
|
||||
import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory;
|
||||
import org.springframework.boot.web.servlet.ServletContextInitializer;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.support.AbstractApplicationContext;
|
||||
import org.springframework.mock.web.MockServletContext;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
|
|
@ -88,11 +95,43 @@ public class SpringBootServletInitializerTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void withErrorPageFilterNotRegistered() throws Exception {
|
||||
new WithErrorPageFilterNotRegistered()
|
||||
.createRootApplicationContext(this.servletContext);
|
||||
assertThat(this.application.getSources())
|
||||
.containsOnly(WithErrorPageFilterNotRegistered.class);
|
||||
public void errorPageFilterRegistrationCanBeDisabled() throws Exception {
|
||||
EmbeddedServletContainer container = new UndertowEmbeddedServletContainerFactory(
|
||||
0).getEmbeddedServletContainer(new ServletContextInitializer() {
|
||||
|
||||
@Override
|
||||
public void onStartup(ServletContext servletContext)
|
||||
throws ServletException {
|
||||
AbstractApplicationContext context = (AbstractApplicationContext) new WithErrorPageFilterNotRegistered()
|
||||
.createRootApplicationContext(servletContext);
|
||||
try {
|
||||
assertThat(context.getBeansOfType(ErrorPageFilter.class))
|
||||
.hasSize(0);
|
||||
}
|
||||
finally {
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
});
|
||||
try {
|
||||
container.start();
|
||||
}
|
||||
finally {
|
||||
container.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void executableWarThatUsesServletInitializerDoesNotHaveErrorPageFilterConfigured()
|
||||
throws Exception {
|
||||
ConfigurableApplicationContext context = new SpringApplication(
|
||||
ExecutableWar.class).run();
|
||||
try {
|
||||
assertThat(context.getBeansOfType(ErrorPageFilter.class)).hasSize(0);
|
||||
}
|
||||
finally {
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -146,8 +185,8 @@ public class SpringBootServletInitializerTests {
|
|||
}
|
||||
|
||||
@Configuration
|
||||
public class WithErrorPageFilterNotRegistered
|
||||
extends MockSpringBootServletInitializer {
|
||||
public static class WithErrorPageFilterNotRegistered
|
||||
extends SpringBootServletInitializer {
|
||||
|
||||
public WithErrorPageFilterNotRegistered() {
|
||||
setRegisterErrorPageFilter(false);
|
||||
|
|
@ -155,6 +194,16 @@ public class SpringBootServletInitializerTests {
|
|||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
public static class ExecutableWar extends SpringBootServletInitializer {
|
||||
|
||||
@Bean
|
||||
public EmbeddedServletContainerFactory containerFactory() {
|
||||
return new UndertowEmbeddedServletContainerFactory(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
public static class Config {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue