1. Overview
In this quick tutorial, we’ll have a look at how to replace the EmbeddedServletContainerCustomizer and ConfigurableEmbeddedServletContainer in Spring Boot 2.
These classes were part of previous versions of Spring Boot, but have been removed starting with Spring Boot 2. Of course, the functionality is still available through the interface WebServerFactoryCustomizer and the class ConfigurableServletWebServerFactory.
Let’s have a look at how to use these.
2. Prior to Spring Boot 2
First, let’s have a look at a configuration that uses the old class and interface and that we’ll need to replace:
@Component public class CustomContainer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(8080); container.setContextPath(""); } }
Here, we’re customizing the servlet container’s port and context path.
Another possibility to achieve this is to use more specific sub-classes of ConfigurableEmbeddedServletContainer, for a container type such as Tomcat:
@Component public class CustomContainer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { if (container instanceof TomcatEmbeddedServletContainerFactory) { TomcatEmbeddedServletContainerFactory tomcatContainer = (TomcatEmbeddedServletContainerFactory) container; tomcatContainer.setPort(8080); tomcatContainer.setContextPath(""); } } }
3. Upgrade to Spring Boot 2
In Spring Boot 2, the EmbeddedServletContainerCustomizer interface is replaced by WebServerFactoryCustomizer, while the ConfigurableEmbeddedServletContainer class is replaced with ConfigurableServletWebServerFactory.
Let’s rewrite the previous example for a Spring Boot 2 project:
public class CustomContainer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { public void customize(ConfigurableServletWebServerFactory factory) { factory.setPort(8080); factory.setContextPath(""); } }
And the second example will now use a TomcatServletWebServerFactory:
@Component public class CustomContainer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> { @Override public void customize(TomcatServletWebServerFactory factory) { factory.setContextPath(""); factory.setPort(8080); } }
Similarly, we have the JettyServletWebServerFactory and UndertowServletWebServerFactory as equivalents for the removed JettyEmbeddedServletContainerFactory and UndertowEmbeddedServletContainerFactory.
4. Conclusion
This short write-up showed how to fix an issue we might encounter when upgrading a Spring Boot application to version 2.x.
An example of a Spring Boot 2 project is available in our GitHub repository.