问题描述
我有一个 EventProducer,它通过 Kafka 向所有消费者发送消息。现在我希望能够通过应用程序属性禁用 Kafka。我通过 ConditionalOnProperty 禁用了 KafkaConfiguration bean。现在的问题是 EventProducer 抛出错误,因为 KafkaConfiguration bean 不存在,尽管在禁用 Kafka 时无法访问 bean。字段不存在 ConditionalOnProperty。如何忽略 EventProducer 中的 KafkaConfiguration?
@Service
@requiredArgsConstructor
public class EventProducer {
@Value("${kafka.enabled}")
private final boolean kafkaEnabled;
private final KafkaConfiguration kafkaConfiguration;
...
}
@EnableKafka
@Configuration
@ConfigurationProperties(prefix = "kafka")
@ConditionalOnProperty(value = "kafka.enabled",havingValue = "true")
@requiredArgsConstructor
public class KafkaConfiguration {
...
}
解决方法
使用@Autowired(required = false)
,在这种情况下,如果kafkaConfiguration
bean 不存在,null
字段保持KafkaConfiguration
,这意味着字段kafkaEnabled
是多余的。
@Service
public class EventProducer {
@Autowired(required = false)
private KafkaConfiguration kafkaConfiguration;
...
}
请注意,此代码不使用构造函数自动连接(删除了 @RequiredArgsConstructor
),因此该字段不再是 final
。