问题描述
我使用 TestContainers
进行集成测试,我使用 @DynamicPropertySource
设置 KafkaContainer
引导服务器,如下所示:
@DynamicPropertySource
static void kafkaProperties(DynamicPropertyRegistry registry) {
registry.add("spring.kafka.bootstrap-servers",() -> {
return kafkaContainer1.getHost() + ":" + kafkaContainer1.getFirstMappedPort();
});
}
这就像一个魅力,即在我的 KafkaTopicConfiguration
类中的预期:
@Configuration
public class KafkaTopicConfiguration {
private String bootstrapServers;
public KafkaTopicConfiguration(@Value("${spring.kafka.bootstrap-servers}") String bootstrapServers) {
this.bootstrapServers = bootstrapServers;
}
其中 bootstrapServers
将获取主机上 Docker 公开的 KafkaContainer 的地址。
现在,我添加了一个空的构造函数,因为我想解决一些问题,如下所示:
public KafkaTopicConfiguration() {
System.out.println("In KafkaTopicConfiguration constructor");
}
突然 boostrapServers
的值变成了 null
。当我删除空的构造函数时,它恢复正常。有谁知道为什么?谢谢。
解决方法
感谢@M.Deinum 指出我的错误。对于后代,我应该在我现有的构造函数上添加 @Autowired
注释,告诉 Spring 使用哪个构造函数:
@Autowired
public KafkaTopicConfiguration(@Value("${spring.kafka.bootstrap-servers}") String bootstrapServers) {
this.bootstrapServers = bootstrapServers;
}
public KafkaTopicConfiguration() {
System.out.println("In KafkaTopicConfiguration constructor");
}
我的其他构造函数虽然没用,我应该在现有的 1-arg 构造函数上添加 SysOut ;-)