我需要自定义默认的KafkaProducerFactory(或任何其他默认工厂,比如KafkaConsumerFactory(,该工厂附带micronaut-kafka依赖项。为此,我试图用取代现有的工厂
@Factory
@Replaces(factory = KafkaProducerFactory.class)
class CustomFactory extends KafkaProducerFactory {
@Bean
@Any
public <K, V> Producer<K, V> getProducer(
@Nullable InjectionPoint<KafkaProducer<K, V>> injectionPoint,
@Nullable @Parameter AbstractKafkaProducerConfiguration<K, V> producerConfiguration) {
validate(producerConfiguration); //this is my primary intension
super.getProducer(injectionPoint, producerConfiguration);
}
}
但Micronaut似乎无法取代KafkaProducerFactory,因此这两家工厂都存在,我在说时出错了
"multiple candidate bean exists [CustomFactory, KafkaProducerFactory]"
我还想在应用程序加载时排除KafkaProducerFactory,但在Micronaut中找不到类似Spring的ComponentScan.excludeFilter的东西。
我的配置有什么问题吗?或者有其他方法可以做到这一点吗?
最后我得到了答案。让我为实际情况详细说明一下,
问题
我们有创建生产者/消费者实例的自定义方式,即创建给定配置属性的实例的自定义类。现在我不得不修改默认工厂,这样工厂就应该调用我们的自定义类来实例化生产者/消费者,而不是自己创建实例。
解决方案
我不得不添加@Primary以及其他注释和它的工作,
@Factory
@Replaces(factory = KafkaProducerFactory.class)
@Primary
class CustomFactory extends KafkaProducerFactory {
//code here
}
但我实现这一目标的方式是一种变通,因为
我的主要意图是覆盖子类中默认工厂的生产者/消费者创建部分,然后用子类替换默认工厂。但根据默认工厂类中的代码结构,它不是一个我们可以插入自定义代码的地方(没有具体的公共方法来整合创建生产者/消费者的代码,它是从3个不同的地方创建的,带有"new"(来创建生产者因此,我们不得不复制整个默认工厂类,并用自定义代码替换了这3个位置,这似乎不是一种正确的方式。