如何打印Spring Boot @ServiceConnection启动TestContainers容器的端口?
如何在Spring Boot 3.2中打印TestContainers MongoDB容器的映射端口
有两种简洁的实现方式:
方式一:@Autowired注入容器实例
直接在TestBootstrap类中注入已声明的MongoDBContainer Bean,再在@PostConstruct方法中获取端口:
@TestConfiguration(proxyBeanMethods = false) class TestBootstrap { private val log = loggerFor<TestBootstrap>() @Autowired private lateinit var mongoDbContainer: MongoDBContainer @Bean @ServiceConnection @RestartScope fun mongoDbContainer() = MongoDBContainer("mongo") @PostConstruct fun printPort() { // 获取容器内部27017端口对应的宿主机映射端口 val mappedPort = mongoDbContainer.getMappedPort(27017) log.info("MongoDB容器映射端口:$mappedPort") // 单端口场景也可简化为:val mappedPort = mongoDbContainer.firstMappedPort } }
方式二:构造函数注入容器实例
采用构造注入的方式获取容器Bean,更符合Spring依赖注入的最佳实践:
@TestConfiguration(proxyBeanMethods = false) class TestBootstrap(private val mongoDbContainer: MongoDBContainer) { private val log = loggerFor<TestBootstrap>() @Bean @ServiceConnection @RestartScope fun mongoDbContainer() = MongoDBContainer("mongo") @PostConstruct fun printPort() { val mappedPort = mongoDbContainer.getMappedPort(27017) log.info("MongoDB容器映射端口:$mappedPort") } }
关键说明
@ServiceConnection会自动启动TestContainers容器,因此@PostConstruct执行时,容器已完成端口映射,可安全获取端口值。getMappedPort(27017)对应MongoDB默认的内部端口;若容器仅暴露单个端口,使用firstMappedPort属性会更简洁。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

