I just announced the new Spring Boot 2 material, coming in REST With Spring:

>> CHECK OUT THE COURSE

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.

I just announced the new Spring Boot 2 material, coming in REST With Spring:

>> CHECK OUT THE LESSONS