没有类型为'的合格bean;org.springframework.kafka.config.AbstractKafkaListenerContainerFactory';可获得的
我想禁用卡夫卡消费者自动启动,并尝试以下代码没有类型为'的合格bean;org.springframework.kafka.config.AbstractKafkaListenerContainerFactory';可获得的,spring,spring-boot,apache-kafka,Spring,Spring Boot,Apache Kafka,我想禁用卡夫卡消费者自动启动,并尝试以下代码 @Component class Customizer { Customizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory, @Value("${start.containers:true}") boolean start) { factory.setAutoStartup(start); }
@Component
class Customizer {
Customizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${start.containers:true}") boolean start) {
factory.setAutoStartup(start);
}
}
它仍然抛出以下错误:
java:[49,12]构造函数KafkaConsumerCustomizer
类com.xx.KafkaConsumerCustomizer不能应用于给定的
类型;[错误]必需:
org.springframework.kafka.config.AbstractKafkaListenerContainerFactory,布尔值
[错误]找到:没有参数[错误]原因:实际和正式
参数列表长度不同[ERROR]->[Help 1]
您的测试可能没有标记为
@SpringBootTest
您可以将mock(AbstractKafkaListenerContainerFactory)
bean添加到测试配置中,或者不在定制程序上使用@Component
;而是在主配置中为其添加一个@Bean
然后,您的测试中的组件扫描将无法找到它
在其他一些@Configuration
类中,添加
@Bean
KafkaConsumerCustomizer cust(){
返回新的KafkaConsumerCustomizer();
}
或者
@Bean
卡夫卡消费者客户(抽象卡夫卡利斯特集装箱工厂,
@值(“${start.containers:true}”)布尔开始){
返回新的卡夫卡消费者定制器(工厂,启动);
}
我是否应该在Customizer类中将“@Component”标记替换为“@Bean”?否;它需要进入@Configuration
类-请参见编辑。这是否意味着我们将有2个文件?问题中提到的一个用“@Component”装饰,另一个用“@Bean”装饰?你能详细说明一下吗?不,只有一个;移除@组件
,并将其声明为@Bean
,而不是在测试中未使用的@Configuration
类中;这样,当没有工厂bean时,它就不会被接受。Gary Russell——根据建议,已经更新了代码,但仍然面临一个问题。已使用最新代码更新问题。如果我添加默认构造函数,它就可以工作,但是我们希望调用参数化构造函数来禁用/启用kafka consumer autostart。请提出建议。您的第二个解决方案将失败,出现NullPointerException
。这些字段是在对象构造之后注入的,您已经在构造函数中访问它们了。所以你的第二个“解决方案”将被打破。另外,为什么不注册类型为ContainerCustomizer
的bean来修改属性?为什么不简单地使用KafkaConsumerCustomizer(@Autowired(required=false)abstractkafkafkalistenerContainerFactory,…)
(并处理factory
为null
)的可能性?
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.config.AbstractKafkaListenerContainerFactory;
import org.springframework.stereotype.Component;
@Component
class KafkaConsumerCustomizer {
KafkaConsumerCustomizer() {
}
KafkaConsumerCustomizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${consumer.autostart:true}") boolean start) {
factory.setAutoStartup(start);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.config.AbstractKafkaListenerContainerFactory;
import org.springframework.stereotype.Component;
@Component
class KafkaConsumerCustomizer {
@Autowired
AbstractKafkaListenerContainerFactory<?, ?, ?> factory;
@Value("${consumer.autostart:true}")
private boolean start;
KafkaConsumerCustomizer() {
factory.setAutoStartup(start);
System.out.println("Setting Autostart: " + start);
}
}
class KafkaConsumerCustomizer {
KafkaConsumerCustomizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
@Value("${consumer.autostart:true}") boolean start) {
factory.setAutoStartup(start);
}
}
@Getter
@RefreshScope
@Import(processorConfig.class)
@Configuration
public class appSpringConfiguration {
@Bean
KafkaConsumerCustomizer kafkaCustomizer() {
return new KafkaConsumerCustomizer();
}
}