Add alwaysMapUrl flag to ServletRegistrationBean
Add an additional constructor to ServletRegistrationBean that indicates if a URL mapping is always required. If set to false, the registration will not longer use the default '/*' mapping. Fixes gh-2596
This commit is contained in:
		
							parent
							
								
									90bff0b603
								
							
						
					
					
						commit
						bd2735ad66
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		|||
 * <p>
 | 
			
		||||
 * 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<String> urlMappings = new LinkedHashSet<String>();
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
		}
 | 
			
		||||
		if (!ObjectUtils.isEmpty(urlMapping)) {
 | 
			
		||||
			registration.addMapping(urlMapping);
 | 
			
		||||
		}
 | 
			
		||||
		registration.setLoadOnStartup(this.loadOnStartup);
 | 
			
		||||
		if (this.multipartConfig != null) {
 | 
			
		||||
			registration.setMultipartConfig(this.multipartConfig);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue