Почему Tomcat прослушивает два порта во время теста Spring Boot с помощью @PostConstruct для получения порта Tomcat?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему Tomcat прослушивает два порта во время теста Spring Boot с помощью @PostConstruct для получения порта Tomcat?

Сообщение Anonymous »

Я написал несколько тестовых классов с помощью @SpringBootTest для приложения Spring Boot, использующего контекст веб-приложения. Тесты должны запускать экземпляр Tomcat со случайным портом.

Код: Выделить всё

/**
* Simple Spring Boot test with a web environment which should listening on random port.
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OnOfTheTestClassses {

@LocalServerPort
private int localPort;

@Test
public void localPort() {
// Should output random port but actually outputs the default of the Tomcat container
Assertions.assertNotEquals(8080, localPort, "Tomcat is listening on default port which is not expected");
}
}
Тестовый код также содержит компонент Spring с некоторыми вспомогательными методами для тестов.

Код: Выделить всё

/**
* Simple bean for test purposes. The bean needs the port Tomcat is listening on.
*/
@Component
public class DemoTestBean {

@Autowired
private WebServerApplicationContext webServerAppCtxt;

// Disabling the annotation so tomcat will listen only on random port
@PostConstruct
public int getPort() {
// In the @PostConstruct phase the property local.server.port isn't set.
// To get a port the bean uses the web server context.
// This causes tomcat listening on two ports: 8080 and a random port.
// Output: Tomcat started on port(s): 8080 (http) > (http)
return webServerAppCtxt.getWebServer().getPort();
}
}
Кажется, все было в порядке, пока я не создал новый класс @SpringBootTest. Некоторые тесты терпят неудачу, поскольку не удалось запустить встроенный Tomcat (сообщение об ошибке: Адрес уже используется). Поэтому я надел шапочку и погрузился в глубокие глубины своего кода и его зависимостей, чтобы выяснить, почему Tomcat использует адрес, который уже используется.
Первое, что я обнаружил. заключалось в том, что Tomcat прослушивает два порта: 8080 и случайный порт, см. следующий журнал:

Код: Выделить всё

com.example.demo.DemoApplicationTests    : Starting DemoApplicationTests using Java 11.0.11 on ME1280 with PID 116328 (started by
com.example.demo.DemoApplicationTests    : No active profile set, falling back to 1 default profile: "default"
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 0 (http)
o.apache.catalina.core.StandardService   : Starting service [Tomcat]
org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.62]
o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1404 ms
o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) 45719 (http) with context path ''
com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 2.696 seconds (JVM running for 4.612)
Я был в замешательстве, почему Tomcat прослушивает свой порт по умолчанию 8080.
После некоторых проб и ошибок с аннотациями Spring Boot и конфигурациях я нашел виновника. Метод @PostConstruct заставляет Tomcat прослушивать порт 8080.
Мне кажется, что внедренный WebServerApplicationContext не ссылается на прослушивает экземпляр tomcat и создает новый экземпляр Connector с портом по умолчанию, когда webServerAppCtxt.getWebServer().getPort() вызывается в методе @PostConstruct. Почему он так себя ведет?
Рабочий пример можно найти здесь. Простая проверка и сборка с помощью maven или предпочитаемой вами IDE. Пример теста завершится неудачно, если Tomcat прослушивает порт по умолчанию 8080.

Подробнее здесь: https://stackoverflow.com/questions/721 ... n-postcons
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как отключить @PostConstruct весной во время теста
    Anonymous » » в форуме JAVA
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Spring Boot 3.4: @MockitoSpyBean вызывает исключение NullPointerException во время @PostConstruct
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Spring Boot 3.4: @MockitoSpyBean вызывает исключение NullPointerException во время @PostConstruct
    Anonymous » » в форуме JAVA
    0 Ответы
    55 Просмотры
    Последнее сообщение Anonymous
  • Spring Boot 3.4: @MockitoSpyBean вызывает исключение NullPointerException во время @PostConstruct
    Anonymous » » в форуме JAVA
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Должен ли я никогда не использовать @PostConstruct в Spring Boot, когда у меня есть конструктор All Args?
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»