Home / Class/ ServletContextInitializerBeansTests Class — spring-boot Architecture

ServletContextInitializerBeansTests Class — spring-boot Architecture

Architecture documentation for the ServletContextInitializerBeansTests class in ServletContextInitializerBeansTests.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletContextInitializerBeansTests.java lines 58–476

class ServletContextInitializerBeansTests {

	private @Nullable ConfigurableApplicationContext context;

	@Test
	void servletThatImplementsServletContextInitializerIsOnlyRegisteredOnce() {
		load(ServletConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory());
		assertThat(initializerBeans).hasSize(1);
		assertThat(initializerBeans.iterator()).toIterable().hasOnlyElementsOfType(TestServlet.class);
	}

	@Test
	void filterThatImplementsServletContextInitializerIsOnlyRegisteredOnce() {
		load(FilterConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory());
		assertThat(initializerBeans).hasSize(1);
		assertThat(initializerBeans.iterator()).toIterable().hasOnlyElementsOfType(TestFilter.class);
	}

	@Test
	void looksForInitializerBeansOfSpecifiedType() {
		load(TestConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThat(initializerBeans).hasSize(1);
		assertThat(initializerBeans.iterator()).toIterable().hasOnlyElementsOfType(TestServletContextInitializer.class);
	}

	@Test
	void whenAnHttpSessionIdListenerBeanIsDefinedThenARegistrationBeanIsCreatedForIt() {
		load(HttpSessionIdListenerConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory());
		assertThat(initializerBeans).hasSize(1);
		assertThat(initializerBeans).first()
			.isInstanceOf(ServletListenerRegistrationBean.class)
			.extracting((initializer) -> ((ServletListenerRegistrationBean<?>) initializer).getListener())
			.isInstanceOf(HttpSessionIdListener.class);
	}

	@Test
	void classesThatImplementMultipleInterfacesAreRegisteredForAllOfThem() {
		load(MultipleInterfacesConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory());
		assertThat(initializerBeans).hasSize(3);
		assertThat(initializerBeans).element(0)
			.isInstanceOf(ServletRegistrationBean.class)
			.extracting((initializer) -> ((ServletRegistrationBean<?>) initializer).getServlet())
			.isInstanceOf(TestServletAndFilterAndListener.class);
		assertThat(initializerBeans).element(1)
			.isInstanceOf(FilterRegistrationBean.class)
			.extracting((initializer) -> ((FilterRegistrationBean<?>) initializer).getFilter())
			.isInstanceOf(TestServletAndFilterAndListener.class);
		assertThat(initializerBeans).element(2)
			.isInstanceOf(ServletListenerRegistrationBean.class)
			.extracting((initializer) -> ((ServletListenerRegistrationBean<?>) initializer).getListener())
			.isInstanceOf(TestServletAndFilterAndListener.class);
	}

	@Test
	@SuppressWarnings("unchecked")
	void shouldApplyServletRegistrationAnnotation() {
		load(ServletConfigurationWithAnnotation.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class, (servletRegistrationBean) -> {
			assertThat(servletRegistrationBean.isEnabled()).isFalse();
			assertThat(servletRegistrationBean.getOrder()).isEqualTo(Ordered.LOWEST_PRECEDENCE);
			assertThat(servletRegistrationBean.getServletName()).isEqualTo("test");
			assertThat(servletRegistrationBean.isAsyncSupported()).isFalse();
			assertThat(servletRegistrationBean.getUrlMappings()).containsExactly("/test/*");
			assertThat(servletRegistrationBean.getInitParameters())
				.containsExactlyInAnyOrderEntriesOf(Map.of("env", "test", "debug", "true"));
			assertThat(servletRegistrationBean.getMultipartConfig()).isNotNull();
			assertThat(servletRegistrationBean.getMultipartConfig().getLocation()).isEqualTo("/tmp");
			assertThat(servletRegistrationBean.getMultipartConfig().getMaxFileSize()).isEqualTo(1024);
			assertThat(servletRegistrationBean.getMultipartConfig().getMaxRequestSize()).isEqualTo(4096);
			assertThat(servletRegistrationBean.getMultipartConfig().getFileSizeThreshold()).isEqualTo(128);
		});
	}

	@Test
	@SuppressWarnings("unchecked")
	void shouldApplyFilterRegistrationAnnotation() {
		load(FilterConfigurationWithAnnotation.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, FilterRegistrationBean.class, (filterRegistrationBean) -> {
			assertThat(filterRegistrationBean.isEnabled()).isFalse();
			assertThat(filterRegistrationBean.getOrder()).isEqualTo(Ordered.LOWEST_PRECEDENCE);
			assertThat(filterRegistrationBean.getFilterName()).isEqualTo("test");
			assertThat(filterRegistrationBean.isAsyncSupported()).isFalse();
			assertThat(filterRegistrationBean.isMatchAfter()).isTrue();
			assertThat(filterRegistrationBean.getServletNames()).containsExactly("test");
			assertThat(filterRegistrationBean.determineDispatcherTypes()).containsExactly(DispatcherType.ERROR);
			assertThat(filterRegistrationBean.getUrlPatterns()).containsExactly("/test/*");
			assertThat(filterRegistrationBean.getInitParameters())
				.containsExactlyInAnyOrderEntriesOf(Map.of("env", "test", "debug", "true"));
			Collection<ServletRegistrationBean<?>> servletRegistrationBeans = filterRegistrationBean
				.getServletRegistrationBeans();
			assertThat(servletRegistrationBeans).hasSize(1);
			assertThat(servletRegistrationBeans.iterator().next().getServletName())
				.isEqualTo("testServletRegistrationBean");

		});
	}

	@Test
	@SuppressWarnings("unchecked")
	void shouldApplyFilterRegistrationAnnotationWithDefaultDispatcherTypes() {
		load(FilterConfigurationWithAnnotationAndDefaultDispatcherTypes.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, FilterRegistrationBean.class,
				(filterRegistrationBean) -> assertThat(filterRegistrationBean.determineDispatcherTypes())
					.containsExactlyElementsOf(EnumSet.allOf(DispatcherType.class)));
	}

	@Test
	void shouldApplyOrderFromBean() {
		load(OrderedServletConfiguration.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class,
				(servletRegistrationBean) -> assertThat(servletRegistrationBean.getOrder())
					.isEqualTo(OrderedTestServlet.ORDER));
	}

	@Test
	void shouldApplyOrderFromOrderAnnotationOnBeanMethod() {
		load(ServletConfigurationWithAnnotationAndOrderAnnotation.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class,
				(servletRegistrationBean) -> assertThat(servletRegistrationBean.getOrder())
					.isEqualTo(ServletConfigurationWithAnnotationAndOrderAnnotation.ORDER));
	}

	@Test
	void orderedInterfaceShouldTakePrecedenceOverOrderAnnotation() {
		load(OrderedServletConfigurationWithAnnotationAndOrder.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class,
				(servletRegistrationBean) -> assertThat(servletRegistrationBean.getOrder())
					.isEqualTo(OrderedTestServlet.ORDER));
	}

	@Test
	void shouldApplyOrderFromOrderAttribute() {
		load(ServletConfigurationWithAnnotationAndOrder.class);
		ServletContextInitializerBeans initializerBeans = new ServletContextInitializerBeans(
				getContext().getBeanFactory(), TestServletContextInitializer.class);
		assertThatSingleRegistration(initializerBeans, ServletRegistrationBean.class,
				(servletRegistrationBean) -> assertThat(servletRegistrationBean.getOrder())
					.isEqualTo(ServletConfigurationWithAnnotationAndOrder.ORDER));
	}

	private void load(Class<?>... configuration) {
		this.context = new AnnotationConfigApplicationContext(configuration);
	}

	private <T extends RegistrationBean> void assertThatSingleRegistration(
			ServletContextInitializerBeans initializerBeans, Class<T> clazz, ThrowingConsumer<T> code) {
		assertThat(initializerBeans).hasSize(1);
		ServletContextInitializer initializer = initializerBeans.iterator().next();
		assertThat(initializer).isInstanceOf(clazz);
		code.accept(clazz.cast(initializer));
	}

	private ConfigurableApplicationContext getContext() {
		assertThat(this.context).isNotNull();
		return this.context;
	}

	@Configuration(proxyBeanMethods = false)
	static class ServletConfiguration {

		@Bean
		TestServlet testServlet() {
			return new TestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class OrderedServletConfiguration {

		@Bean
		OrderedTestServlet testServlet() {
			return new OrderedTestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class ServletConfigurationWithAnnotation {

		@Bean
		@ServletRegistration(enabled = false, name = "test", asyncSupported = false, urlMappings = "/test/*",
				loadOnStartup = 1,
				initParameters = { @WebInitParam(name = "env", value = "test"),
						@WebInitParam(name = "debug", value = "true") },
				multipartConfig = @MultipartConfig(location = "/tmp", maxFileSize = 1024, maxRequestSize = 4096,
						fileSizeThreshold = 128))
		TestServlet testServlet() {
			return new TestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class ServletConfigurationWithAnnotationAndOrderAnnotation {

		static final int ORDER = 7;

		@Bean
		@ServletRegistration(name = "test")
		@Order(ORDER)
		TestServlet testServlet() {
			return new TestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class ServletConfigurationWithAnnotationAndOrder {

		static final int ORDER = 9;

		@Bean
		@ServletRegistration(name = "test", order = ORDER)
		TestServlet testServlet() {
			return new TestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class OrderedServletConfigurationWithAnnotationAndOrder {

		static final int ORDER = 5;

		@Bean
		@ServletRegistration
		@Order(ORDER)
		OrderedTestServlet testServlet() {
			return new OrderedTestServlet();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class FilterConfiguration {

		@Bean
		TestFilter testFilter() {
			return new TestFilter();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class FilterConfigurationWithAnnotation {

		@Bean
		@FilterRegistration(
				enabled = false, name = "test", asyncSupported = false, dispatcherTypes = DispatcherType.ERROR,
				matchAfter = true, servletNames = "test", urlPatterns = "/test/*", initParameters = {
						@WebInitParam(name = "env", value = "test"), @WebInitParam(name = "debug", value = "true") },
				servletClasses = { TestServlet.class })
		TestFilter testFilter() {
			return new TestFilter();
		}

		@Bean
		ServletRegistrationBean<TestServlet> testServletRegistrationBean() {
			return new ServletRegistrationBean<>(new TestServlet());
		}

		@Bean
		ServletRegistrationBean<NonMatchingServlet> nonMatchingServletRegistrationBean() {
			return new ServletRegistrationBean<>(new NonMatchingServlet());
		}

		static class NonMatchingServlet extends HttpServlet implements ServletContextInitializer {

			@Override
			public void onStartup(ServletContext servletContext) {

			}

		}

	}

	@Configuration(proxyBeanMethods = false)
	static class FilterConfigurationWithAnnotationAndDefaultDispatcherTypes {

		@Bean
		@FilterRegistration(name = "test")
		TestOncePerRequestFilter testFilter() {
			return new TestOncePerRequestFilter();
		}

		static class TestOncePerRequestFilter extends OncePerRequestFilter {

			@Override
			protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
					FilterChain filterChain) {
			}

		}

	}

	@Configuration(proxyBeanMethods = false)
	static class MultipleInterfacesConfiguration {

		@Bean
		TestServletAndFilterAndListener testServletAndFilterAndListener() {
			return new TestServletAndFilterAndListener();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class TestConfiguration {

		@Bean
		TestServletContextInitializer testServletContextInitializer() {
			return new TestServletContextInitializer();
		}

		@Bean
		OtherTestServletContextInitializer otherTestServletContextInitializer() {
			return new OtherTestServletContextInitializer();
		}

	}

	@Configuration(proxyBeanMethods = false)
	static class HttpSessionIdListenerConfiguration {

		@Bean
		HttpSessionIdListener httpSessionIdListener() {
			return (event, oldId) -> {
			};
		}

	}

	static class TestServlet extends HttpServlet implements ServletContextInitializer {

		@Override
		public void onStartup(ServletContext servletContext) {

		}

	}

	static class OrderedTestServlet extends HttpServlet implements ServletContextInitializer, Ordered {

		static final int ORDER = 3;

		@Override
		public void onStartup(ServletContext servletContext) {

		}

		@Override
		public int getOrder() {
			return ORDER;
		}

	}

	static class TestFilter implements Filter, ServletContextInitializer {

		@Override
		public void onStartup(ServletContext servletContext) {

		}

		@Override
		public void init(FilterConfig filterConfig) {

		}

		@Override
		public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

		}

	}

	static class TestServletContextInitializer implements ServletContextInitializer {

		@Override
		public void onStartup(ServletContext servletContext) {

		}

	}

	static class OtherTestServletContextInitializer implements ServletContextInitializer {

		@Override
		public void onStartup(ServletContext servletContext) {

		}

	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free