diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java index 7dff5632579..05c0b206ee1 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfiguration.java @@ -113,69 +113,66 @@ public class DispatcherServletAutoConfiguration { return checkServletRegistrations(beanFactory); } - private ConditionOutcome checkServlets(ConfigurableListableBeanFactory beanFactory) { - List servlets = Arrays.asList(beanFactory.getBeanNamesForType( - DispatcherServlet.class, false, false)); - boolean containsDispatcherBean = beanFactory - .containsBean(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); - if (servlets.isEmpty()) { - if (containsDispatcherBean) { - return ConditionOutcome - .noMatch("found no DispatcherServlet but a non-DispatcherServlet named " - + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); - } - return ConditionOutcome.match("no DispatcherServlet found"); - } - if (servlets.contains(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)) { - return ConditionOutcome.noMatch("found DispatcherServlet named " - + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); - } + } + + private static ConditionOutcome checkServlets( + ConfigurableListableBeanFactory beanFactory) { + List servlets = Arrays.asList(beanFactory.getBeanNamesForType( + DispatcherServlet.class, false, false)); + boolean containsDispatcherBean = beanFactory + .containsBean(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); + if (servlets.isEmpty()) { if (containsDispatcherBean) { - return ConditionOutcome.noMatch("found non-DispatcherServlet named " - + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); - } - - return ConditionOutcome - .match("one or more DispatcherServlets found and none is named " - + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); - - } - - /** - */ - protected ConditionOutcome checkServletRegistrations( - ConfigurableListableBeanFactory beanFactory) { - - List registrations = Arrays.asList(beanFactory.getBeanNamesForType( - ServletRegistrationBean.class, false, false)); - boolean containsDispatcherRegistrationBean = beanFactory - .containsBean(DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); - - if (registrations.isEmpty()) { - if (containsDispatcherRegistrationBean) { - return ConditionOutcome - .noMatch("found no ServletRegistrationBean but a non-ServletRegistrationBean named " - + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); - } - return ConditionOutcome.match("no ServletRegistrationBean found"); - } - - if (registrations.contains(DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)) { - return ConditionOutcome.noMatch("found ServletRegistrationBean named " - + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); - } - if (containsDispatcherRegistrationBean) { return ConditionOutcome - .noMatch("found non-ServletRegistrationBean named " - + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + .noMatch("found no DispatcherServlet but a non-DispatcherServlet named " + + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); } - - return ConditionOutcome - .match("one or more ServletRegistrationBeans is found and none is named " - + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); - + return ConditionOutcome.match("no DispatcherServlet found"); } + if (servlets.contains(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)) { + return ConditionOutcome.noMatch("found DispatcherServlet named " + + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); + } + if (containsDispatcherBean) { + return ConditionOutcome.noMatch("found non-DispatcherServlet named " + + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); + } + + return ConditionOutcome + .match("one or more DispatcherServlets found and none is named " + + DEFAULT_DISPATCHER_SERVLET_BEAN_NAME); } + private static ConditionOutcome checkServletRegistrations( + ConfigurableListableBeanFactory beanFactory) { + + List registrations = Arrays.asList(beanFactory.getBeanNamesForType( + ServletRegistrationBean.class, false, false)); + boolean containsDispatcherRegistrationBean = beanFactory + .containsBean(DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + + if (registrations.isEmpty()) { + if (containsDispatcherRegistrationBean) { + return ConditionOutcome + .noMatch("found no ServletRegistrationBean but a non-ServletRegistrationBean named " + + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + } + return ConditionOutcome.match("no ServletRegistrationBean found"); + } + + if (registrations.contains(DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)) { + return ConditionOutcome.noMatch("found ServletRegistrationBean named " + + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + } + if (containsDispatcherRegistrationBean) { + return ConditionOutcome.noMatch("found non-ServletRegistrationBean named " + + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + } + + return ConditionOutcome + .match("one or more ServletRegistrationBeans is found and none is named " + + DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); + + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfigurationTests.java index 15c6f20cdab..8e0f4ee0ecd 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/DispatcherServletAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.web; import javax.servlet.MultipartConfigElement; import org.junit.Test; +import org.springframework.beans.factory.UnsatisfiedDependencyException; import org.springframework.boot.context.embedded.MultiPartConfigFactory; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.boot.test.EnvironmentTestUtils; @@ -69,6 +70,23 @@ public class DispatcherServletAutoConfigurationTests { assertEquals(0, this.context.getBeanNamesForType(DispatcherServlet.class).length); } + // If you override either the dispatcherServlet or its registration you have to + // provide both... + @Test(expected = UnsatisfiedDependencyException.class) + public void registrationOverrideWithAutowiredServlet() throws Exception { + this.context = new AnnotationConfigWebApplicationContext(); + this.context.register(CustomAutowiredRegistration.class, + ServerPropertiesAutoConfiguration.class, + DispatcherServletAutoConfiguration.class); + this.context.setServletContext(new MockServletContext()); + this.context.refresh(); + ServletRegistrationBean registration = this.context + .getBean(ServletRegistrationBean.class); + assertEquals("[/foo]", registration.getUrlMappings().toString()); + assertEquals("customDispatcher", registration.getServletName()); + assertEquals(1, this.context.getBeanNamesForType(DispatcherServlet.class).length); + } + @Test public void servletPath() throws Exception { this.context = new AnnotationConfigWebApplicationContext(); @@ -121,4 +139,16 @@ public class DispatcherServletAutoConfigurationTests { } } + @Configuration + protected static class CustomAutowiredRegistration { + @Bean + public ServletRegistrationBean dispatcherServletRegistration( + DispatcherServlet dispatcherServlet) { + ServletRegistrationBean registration = new ServletRegistrationBean( + dispatcherServlet, "/foo"); + registration.setName("customDispatcher"); + return registration; + } + } + }