没有类型为'的合格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();
  }
}