|
|
|
|
@ -19,18 +19,16 @@ package org.springframework.boot.autoconfigure.web.servlet;
@@ -19,18 +19,16 @@ package org.springframework.boot.autoconfigure.web.servlet;
|
|
|
|
|
import javax.servlet.MultipartConfigElement; |
|
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
|
|
|
|
|
|
import org.junit.After; |
|
|
|
|
import org.junit.Test; |
|
|
|
|
|
|
|
|
|
import org.springframework.beans.DirectFieldAccessor; |
|
|
|
|
import org.springframework.boot.test.util.TestPropertyValues; |
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigurations; |
|
|
|
|
import org.springframework.boot.test.context.runner.WebApplicationContextRunner; |
|
|
|
|
import org.springframework.boot.web.servlet.MultipartConfigFactory; |
|
|
|
|
import org.springframework.boot.web.servlet.ServletRegistrationBean; |
|
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
|
import org.springframework.context.event.ContextRefreshedEvent; |
|
|
|
|
import org.springframework.mock.web.MockServletContext; |
|
|
|
|
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; |
|
|
|
|
import org.springframework.web.multipart.MultipartException; |
|
|
|
|
import org.springframework.web.multipart.MultipartHttpServletRequest; |
|
|
|
|
import org.springframework.web.multipart.MultipartResolver; |
|
|
|
|
@ -47,146 +45,124 @@ import static org.assertj.core.api.Assertions.assertThat;
@@ -47,146 +45,124 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|
|
|
|
*/ |
|
|
|
|
public class DispatcherServletAutoConfigurationTests { |
|
|
|
|
|
|
|
|
|
private AnnotationConfigWebApplicationContext context; |
|
|
|
|
|
|
|
|
|
@After |
|
|
|
|
public void closeContext() { |
|
|
|
|
if (this.context != null) { |
|
|
|
|
this.context.close(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
private WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() |
|
|
|
|
.withConfiguration(AutoConfigurations.of( |
|
|
|
|
DispatcherServletAutoConfiguration.class)); |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void registrationProperties() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.register(DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBean(DispatcherServlet.class)).isNotNull(); |
|
|
|
|
ServletRegistrationBean<?> registration = this.context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/]"); |
|
|
|
|
this.contextRunner.run(context -> { |
|
|
|
|
assertThat(context.getBean(DispatcherServlet.class)).isNotNull(); |
|
|
|
|
ServletRegistrationBean<?> registration = context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/]"); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void registrationNonServletBean() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.register(NonServletConfiguration.class, |
|
|
|
|
DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(ServletRegistrationBean.class).length) |
|
|
|
|
.isEqualTo(0); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(DispatcherServlet.class).length) |
|
|
|
|
.isEqualTo(0); |
|
|
|
|
this.contextRunner.withUserConfiguration(NonServletConfiguration.class) |
|
|
|
|
.run(context -> { |
|
|
|
|
assertThat(context.getBeanNamesForType(ServletRegistrationBean.class)) |
|
|
|
|
.isEmpty(); |
|
|
|
|
assertThat(context.getBeanNamesForType(DispatcherServlet.class)) |
|
|
|
|
.isEmpty(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If a DispatcherServlet instance is registered with a name different
|
|
|
|
|
// from the default one, we're registering one anyway
|
|
|
|
|
@Test |
|
|
|
|
public void registrationOverrideWithDispatcherServletWrongName() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.register(CustomDispatcherServletWrongName.class, |
|
|
|
|
DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
ServletRegistrationBean<?> registration = this.context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/]"); |
|
|
|
|
assertThat(registration.getServletName()).isEqualTo("dispatcherServlet"); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(DispatcherServlet.class).length) |
|
|
|
|
.isEqualTo(2); |
|
|
|
|
this.contextRunner.withUserConfiguration(CustomDispatcherServletWrongName.class) |
|
|
|
|
.run(context -> { |
|
|
|
|
ServletRegistrationBean<?> registration = context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/]"); |
|
|
|
|
assertThat(registration.getServletName()).isEqualTo("dispatcherServlet"); |
|
|
|
|
assertThat(context.getBeanNamesForType(DispatcherServlet.class)) |
|
|
|
|
.hasSize(2); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void registrationOverrideWithAutowiredServlet() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.register(CustomAutowiredRegistration.class, |
|
|
|
|
DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
ServletRegistrationBean<?> registration = this.context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/foo]"); |
|
|
|
|
assertThat(registration.getServletName()).isEqualTo("customDispatcher"); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(DispatcherServlet.class).length) |
|
|
|
|
.isEqualTo(1); |
|
|
|
|
this.contextRunner.withUserConfiguration(CustomAutowiredRegistration.class) |
|
|
|
|
.run(context -> { |
|
|
|
|
ServletRegistrationBean<?> registration = context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/foo]"); |
|
|
|
|
assertThat(registration.getServletName()).isEqualTo("customDispatcher"); |
|
|
|
|
assertThat(context.getBeanNamesForType(DispatcherServlet.class)) |
|
|
|
|
.hasSize(1); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void servletPath() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.register(DispatcherServletAutoConfiguration.class); |
|
|
|
|
TestPropertyValues.of("server.servlet.path:/spring").applyTo(this.context); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBean(DispatcherServlet.class)).isNotNull(); |
|
|
|
|
ServletRegistrationBean<?> registration = this.context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/spring/*]"); |
|
|
|
|
assertThat(registration.getMultipartConfig()).isNull(); |
|
|
|
|
this.contextRunner.withPropertyValues("server.servlet.path:/spring") |
|
|
|
|
.run(context -> { |
|
|
|
|
assertThat(context.getBean(DispatcherServlet.class)).isNotNull(); |
|
|
|
|
ServletRegistrationBean<?> registration = context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getUrlMappings().toString()).isEqualTo("[/spring/*]"); |
|
|
|
|
assertThat(registration.getMultipartConfig()).isNull(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void multipartConfig() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.register(MultipartConfiguration.class, |
|
|
|
|
DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
ServletRegistrationBean<?> registration = this.context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getMultipartConfig()).isNotNull(); |
|
|
|
|
this.contextRunner.withUserConfiguration(MultipartConfiguration.class) |
|
|
|
|
.run(context -> { |
|
|
|
|
ServletRegistrationBean<?> registration = context |
|
|
|
|
.getBean(ServletRegistrationBean.class); |
|
|
|
|
assertThat(registration.getMultipartConfig()).isNotNull(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void renamesMultipartResolver() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.register(MultipartResolverConfiguration.class, |
|
|
|
|
DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
DispatcherServlet dispatcherServlet = this.context |
|
|
|
|
.getBean(DispatcherServlet.class); |
|
|
|
|
dispatcherServlet.onApplicationEvent(new ContextRefreshedEvent(this.context)); |
|
|
|
|
assertThat(dispatcherServlet.getMultipartResolver()) |
|
|
|
|
.isInstanceOf(MockMultipartResolver.class); |
|
|
|
|
this.contextRunner.withUserConfiguration(MultipartResolverConfiguration.class) |
|
|
|
|
.run(context -> { |
|
|
|
|
DispatcherServlet dispatcherServlet = context |
|
|
|
|
.getBean(DispatcherServlet.class); |
|
|
|
|
dispatcherServlet.onApplicationEvent(new ContextRefreshedEvent(context)); |
|
|
|
|
assertThat(dispatcherServlet.getMultipartResolver()) |
|
|
|
|
.isInstanceOf(MockMultipartResolver.class); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void dispatcherServletDefaultConfig() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.register(DispatcherServletAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
DispatcherServlet bean = this.context.getBean(DispatcherServlet.class); |
|
|
|
|
assertThat(bean).extracting("throwExceptionIfNoHandlerFound") |
|
|
|
|
.containsExactly(false); |
|
|
|
|
assertThat(bean).extracting("dispatchOptionsRequest").containsExactly(true); |
|
|
|
|
assertThat(bean).extracting("dispatchTraceRequest").containsExactly(false); |
|
|
|
|
assertThat(new DirectFieldAccessor( |
|
|
|
|
this.context.getBean("dispatcherServletRegistration")) |
|
|
|
|
.getPropertyValue("loadOnStartup")).isEqualTo(-1); |
|
|
|
|
this.contextRunner.run(context -> { |
|
|
|
|
DispatcherServlet bean = context.getBean(DispatcherServlet.class); |
|
|
|
|
assertThat(bean).extracting("throwExceptionIfNoHandlerFound") |
|
|
|
|
.containsExactly(false); |
|
|
|
|
assertThat(bean).extracting("dispatchOptionsRequest").containsExactly(true); |
|
|
|
|
assertThat(bean).extracting("dispatchTraceRequest").containsExactly(false); |
|
|
|
|
assertThat(new DirectFieldAccessor( |
|
|
|
|
context.getBean("dispatcherServletRegistration")) |
|
|
|
|
.getPropertyValue("loadOnStartup")).isEqualTo(-1); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void dispatcherServletCustomConfig() { |
|
|
|
|
this.context = new AnnotationConfigWebApplicationContext(); |
|
|
|
|
this.context.setServletContext(new MockServletContext()); |
|
|
|
|
this.context.register(DispatcherServletAutoConfiguration.class); |
|
|
|
|
TestPropertyValues.of("spring.mvc.throw-exception-if-no-handler-found:true", |
|
|
|
|
this.contextRunner.withPropertyValues( |
|
|
|
|
"spring.mvc.throw-exception-if-no-handler-found:true", |
|
|
|
|
"spring.mvc.dispatch-options-request:false", |
|
|
|
|
"spring.mvc.dispatch-trace-request:true", |
|
|
|
|
"spring.mvc.servlet.load-on-startup=5").applyTo(this.context); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
DispatcherServlet bean = this.context.getBean(DispatcherServlet.class); |
|
|
|
|
assertThat(bean).extracting("throwExceptionIfNoHandlerFound") |
|
|
|
|
.containsExactly(true); |
|
|
|
|
assertThat(bean).extracting("dispatchOptionsRequest").containsExactly(false); |
|
|
|
|
assertThat(bean).extracting("dispatchTraceRequest").containsExactly(true); |
|
|
|
|
assertThat(new DirectFieldAccessor( |
|
|
|
|
this.context.getBean("dispatcherServletRegistration")) |
|
|
|
|
.getPropertyValue("loadOnStartup")).isEqualTo(5); |
|
|
|
|
"spring.mvc.servlet.load-on-startup=5") |
|
|
|
|
.run(context -> { |
|
|
|
|
DispatcherServlet bean = context.getBean(DispatcherServlet.class); |
|
|
|
|
assertThat(bean).extracting("throwExceptionIfNoHandlerFound") |
|
|
|
|
.containsExactly(true); |
|
|
|
|
assertThat(bean).extracting("dispatchOptionsRequest").containsExactly(false); |
|
|
|
|
assertThat(bean).extracting("dispatchTraceRequest").containsExactly(true); |
|
|
|
|
assertThat(new DirectFieldAccessor( |
|
|
|
|
context.getBean("dispatcherServletRegistration")) |
|
|
|
|
.getPropertyValue("loadOnStartup")).isEqualTo(5); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
|