1. Обзор
Приложение Spring Boot встраивает веб-сервер, и иногда мы можем захотеть обнаружить порт HTTP во время выполнения.
В этом учебнике мы будем рассмотрены, как получить порт HTTP программно в приложении Spring Boot.
2. Введение
2.1. Наша весенняя загрузка приложения
Мы создадим простой пример приложения Spring Boot, чтобы быстро показать методы обнаружения порта HTTP во время выполнения:
@SpringBootApplication public class GetServerPortApplication { public static void main(String[] args) { SpringApplication.run(GetServerPortApplication.class, args); } }
2.2. Два сценария создания порта
Как правило, самый простой способ настроить порт http приложение Spring Boot определяет порт в файле конфигурации application.properts или application.yml .
Например, в application.properts файл, мы можем установить 7777 как порт наше приложение работает на:
server.port=7777
Кроме того, вместо определения фиксированного порта, мы можем позволить приложению Spring Boot работать на случайном порту, установив « 0 ” как значение “ server.port ” недвижимость :
server.port=0
Далее давайте рассмотрим два сценария и обсудим различные способы, чтобы получить порт программно на время выполнения.
В этом учебнике мы обнаружим серверный порт в унитарных тестах.
3. Получение фиксированного порта во время выполнения
Давайте создадим файл свойств приложения-fixedport.properties и определить фиксированный портовый 7777 в нем:
server.port=7777
Далее мы постараемся получить порт в классе единицы испытаний:
@RunWith(SpringRunner.class) @SpringBootTest(classes = GetServerPortApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @ActiveProfiles("fixedport") public class GetServerFixedPortUnitTest { private final static int EXPECTED_PORT = 7777; .... }
Прежде чем мы увидим методы тестирования, давайте кратко рассмотрим аннотации тестового класса:
- @RunWith (СпрингРаннер.class) – Это присоединится к тесту JUnit с весенним ТестКонтекст
- @SpringBootTest (… SpringBootTest.WebEnvironment.DEFINED_PORT) – В СпрингБотст , мы будем использовать DEFINED_PORT для встроенного веб-сервера
- @ActiveProfiles (“фиксированныйпорт”) – С помощью этой аннотации мы включили Весенний профиль ” фиксированный ” так что наши приложения-fixedport.properties будут загружены
3.1. Использование аннотации @Value (“$-сервер.порт”).
С приложения-fixedport.properties файл будет загружен, мы можем получить ” server.port ” свойство, используя @Value аннотация :
@Value("${server.port}") private int serverPort; @Test public void givenFixedPortAsServerPort_whenReadServerPort_thenGetThePort() { assertEquals(EXPECTED_PORT, serverPort); }
3.2. Использование класса ServerProperties
СерверПредложение содержит свойства встроенного веб-сервера, такие как порт, адрес и заголовок сервера.
Мы можем ввести СерверПредложение компонента и получить порт от него:
@Autowired private ServerProperties serverProperties; @Test public void givenFixedPortAsServerPort_whenReadServerProps_thenGetThePort() { int port = serverProperties.getPort(); assertEquals(EXPECTED_PORT, port); }
До сих пор мы узнали два способа получить фиксированный порт во время выполнения. Далее давайте посмотрим, как обнаружить порт в случайном сценарии порта.
4. Получение случайного порта в Runtime
На этот раз давайте создадим еще один файл свойств приложение-randomport.properts :
server.port=0
Как показано в коде выше, мы позволяем Spring Boot выбирать свободный порт случайным образом, когда начинается веб-сервер.
В том же духе, давайте создадим еще один класс единицы теста:
.... @ActiveProfiles("randomport") public class GetServerRandomPortUnitTest { ... }
Здесь мы должны активировать ” случайный ” Весенний профиль для загрузки соответствующего файла свойств.
Мы нашли два способа открыть стационарный порт во время выполнения. Тем не менее, они не могут помочь нам получить случайный порт:
@Value("${server.port}") private int randomServerPort; @Test public void given0AsServerPort_whenReadServerPort_thenGet0() { assertEquals(0, randomServerPort); } @Autowired private ServerProperties serverProperties; @Test public void given0AsServerPort_whenReadServerProps_thenGet0() { int port = serverProperties.getPort(); assertEquals(0, port); }
Как показывают два метода тестирования, оба @Value (“$-сервер.порт”) и serverProperties.getPort() доклад “0” в качестве порта. Очевидно, что это не тот правильный порт, которого мы ожидаем.
4.1. Использование ServletWebServerApplicationContext
Весенняя загрузка начинает ServletWebServerApplicationContext при запуске встроенного веб-сервера.
Таким образом, мы можем получить WebServer из контекста объекта для получения информации о сервере или управления сервером:
@Autowired private ServletWebServerApplicationContext webServerAppCtxt; @Test public void given0AsServerPort_whenReadWebAppCtxt_thenGetThePort() { int port = webServerAppCtxt.getWebServer().getPort(); assertTrue(port > 1023); }
В тесте выше, мы проверяем, если порт больше, чем 1023. Это потому, что 0-1023 являются системные порты.
4.2. Обработка ServletWebServerInitializedEvent
Весеннее приложение может публиковать различные события и EventListeners обрабатывать события.
Когда встроенный веб-сервер начал работу, ServletWebServerInitializedEvent будут опубликованы. Это событие содержит информацию о веб-сервере.
Таким образом, мы можем создать EventListener чтобы получить порт от этого события:
@Service public class ServerPortService { private int port; public int getPort() { return port; } @EventListener public void onApplicationEvent(final ServletWebServerInitializedEvent event) { port = event.getWebServer().getPort(); } }
Мы можем ввести сервисный компонент в наш тестовый класс, чтобы быстро получить случайный порт:
@Autowired private ServerPortService serverPortService; @Test public void given0AsServerPort_whenReadFromListener_thenGetThePort() { int port = serverPortService.getPort(); assertTrue(port > 1023); }
5. Заключение
Обычно мы настраиваем серверный порт приложения Spring Boot в файле свойств или файле YAML, где мы можем установить либо фиксированный, либо случайный порт.
В этой статье мы обсудили различные подходы для получения фиксированного и случайного порта во время выполнения.
Как всегда, полный исходный код статьи доступен более на GitHub .