«1. Обзор

В этом кратком руководстве мы рассмотрим, как заменить EmbeddedServletContainerCustomizer и ConfigurableEmbeddedServletContainer в Spring Boot 2.

Эти классы были частью предыдущих версий Spring Boot, но были удалены, начиная с Spring Boot 2. Разумеется, функционал по-прежнему доступен через интерфейс WebServerFactoryCustomizer и класс ConfigurableServletWebServerFactory.

Давайте посмотрим, как их использовать.

2. До Spring Boot 2

Во-первых, давайте посмотрим на конфигурацию, которая использует старый класс и интерфейс и которую нам нужно заменить:

@Component
public class CustomContainer implements EmbeddedServletContainerCustomizer {
 
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        container.setPort(8080);
        container.setContextPath("");
     }
}

Здесь мы настраиваем порт контейнера сервлета и контекстный путь.

Другой возможностью добиться этого является использование более конкретных подклассов ConfigurableEmbeddedServletContainer для контейнеров типа 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. Обновление до Spring Boot 2

В Spring Boot 2 EmbeddedServletContainerCustomizer Интерфейс заменяется на WebServerFactoryCustomizer, а класс ConfigurableEmbeddedServletContainer заменяется на ConfigurableServletWebServerFactory.

Давайте перепишем предыдущий пример для проекта Spring Boot 2:

public class CustomContainer implements 
  WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
 
    public void customize(ConfigurableServletWebServerFactory factory) {
        factory.setPort(8080);
        factory.setContextPath("");
     }
}

А во втором примере теперь будет использоваться TomcatServletWebServerFactory:

@Component
public class CustomContainer implements 
  WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.setContextPath("");
        factory.setPort(8080);
    }
}

Точно так же у нас есть JettyServletWebServerFactory и UndertowServletWebServerFactory как эквиваленты для JettyEmbeddedServletContainerFactory и UndertowEmbeddedServletContainerFactory.

4. Заключение

В этой краткой статье показано, как исправить проблему, с которой мы можем столкнуться при обновлении приложения Spring Boot до версии 2.x.

Пример проекта Spring Boot 2 доступен в нашем репозитории GitHub.