diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/ServletRegistrationBean.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/ServletRegistrationBean.java index f85c8ef2944..77387cb5bfa 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/ServletRegistrationBean.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/ServletRegistrationBean.java @@ -31,6 +31,7 @@ import javax.servlet.ServletRegistration.Dynamic; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** * A {@link ServletContextInitializer} to register {@link Servlet}s in a Servlet 3.0+ @@ -40,7 +41,9 @@ import org.springframework.util.Assert; *

* The {@link #setServlet(Servlet) servlet} must be specified before calling * {@link #onStartup}. URL mapping can be configured used {@link #setUrlMappings} or - * omitted when mapping to '/*'. The servlet name will be deduced if not specified. + * omitted when mapping to '/*' (unless + * {@link #ServletRegistrationBean(Servlet, boolean, String...) alwaysMapUrl} is set to + * {@code false}). The servlet name will be deduced if not specified. * * @author Phillip Webb * @see ServletContextInitializer @@ -56,6 +59,8 @@ public class ServletRegistrationBean extends RegistrationBean { private Set urlMappings = new LinkedHashSet(); + private boolean alwaysMapUrl = true; + private int loadOnStartup = -1; private MultipartConfigElement multipartConfig; @@ -73,9 +78,22 @@ public class ServletRegistrationBean extends RegistrationBean { * @param urlMappings the URLs being mapped */ public ServletRegistrationBean(Servlet servlet, String... urlMappings) { + this(servlet, true, urlMappings); + } + + /** + * Create a new {@link ServletRegistrationBean} instance with the specified + * {@link Servlet} and URL mappings. + * @param servlet the servlet being mapped + * @param alwaysMapUrl if omitted URL mappings should be replaced with '/*' + * @param urlMappings the URLs being mapped + */ + public ServletRegistrationBean(Servlet servlet, boolean alwaysMapUrl, + String... urlMappings) { Assert.notNull(servlet, "Servlet must not be null"); Assert.notNull(urlMappings, "UrlMappings must not be null"); this.servlet = servlet; + this.alwaysMapUrl = alwaysMapUrl; this.urlMappings.addAll(Arrays.asList(urlMappings)); } @@ -164,7 +182,7 @@ public class ServletRegistrationBean extends RegistrationBean { Assert.notNull(this.servlet, "Servlet must not be null"); String name = getServletName(); if (!isEnabled()) { - logger.info("Filter " + name + " was not registered (disabled)"); + logger.info("Servlet " + name + " was not registered (disabled)"); return; } logger.info("Mapping servlet: '" + name + "' to " + this.urlMappings); @@ -186,10 +204,12 @@ public class ServletRegistrationBean extends RegistrationBean { super.configure(registration); String[] urlMapping = this.urlMappings .toArray(new String[this.urlMappings.size()]); - if (urlMapping.length == 0) { + if (urlMapping.length == 0 && this.alwaysMapUrl) { urlMapping = DEFAULT_MAPPINGS; } - registration.addMapping(urlMapping); + if (!ObjectUtils.isEmpty(urlMapping)) { + registration.addMapping(urlMapping); + } registration.setLoadOnStartup(this.loadOnStartup); if (this.multipartConfig != null) { registration.setMultipartConfig(this.multipartConfig); diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/ServletRegistrationBeanTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/ServletRegistrationBeanTests.java index bdfa5e602d9..a8cc4ee2f86 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/ServletRegistrationBeanTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/ServletRegistrationBeanTests.java @@ -36,6 +36,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.never; @@ -196,4 +197,11 @@ public class ServletRegistrationBeanTests { verify(this.registration).setInitParameters(Collections.singletonMap("a", "c")); } + @Test + public void withoutDefaultMappings() throws Exception { + ServletRegistrationBean bean = new ServletRegistrationBean(this.servlet, false); + bean.onStartup(this.servletContext); + verify(this.registration, never()).addMapping((String[]) any()); + } + }