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());
+ }
+
}