70.4 发现运行时的HTTP端口

你可以通过日志输出或它的EmbeddedServletContainerEmbeddedWebApplicationContext获取服务器正在运行的端口。获取和确认服务器已经初始化的最好方式是添加一个ApplicationListener<EmbeddedServletContainerInitializedEvent>类型的@Bean,然后当事件发布时将容器pull出来。

使用@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)进行测试时,你可以通过@LocalServerPort注解将实际端口注入到字段中,例如:

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
  3. public class MyWebIntegrationTests {
  4. @Autowired
  5. EmbeddedWebApplicationContext server;
  6. @LocalServerPort
  7. int port;
  8. // ...
  9. }

@LocalServerPort@Value("${local.server.port}")的元数据,在常规的应用中不要尝试注入端口。正如我们看到的,该值只会在容器初始化后设置。相对于测试,应用代码回调处理的会更早(例如在该值实际可用之前)。