没有“org.springframework.kafka.config.abstractkafkalistenercontainerfactory”类型的限定bean可用

3ks5zfa0  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(360)

我想禁用Kafka消费者正在自动启动,并尝试下面的代码

@Component
class Customizer {

    Customizer(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
            @Value("${start.containers:true}") boolean start) {

        factory.setAutoStartup(start);
    }

}

当我禁用测试用例时,它可以正常工作,但是在执行测试用例时,我看到下面的错误。
java.lang.illegalstateexception:未能加载应用程序上下文,原因是:org.springframework.beans.factory.unsatifiedDependencyException:创建名为“kafkanconsumercustomizer”的bean时出错,该bean在文件[kafkanconsumercustomizer.class]中定义:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“org.springframework.kafka.config.abstractkafkalistenercontainerfactory”的合格bean可用:至少需要1个符合autowire候选的bean。
我添加了空的默认构造函数以使测试用例通过,但是它总是引用空的默认构造函数,而不是参数化的构造函数。有没有办法只对测试用例使用空的默认构造函数,否则就使用参数化构造函数?
我试过以下方法
解决方案1:

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);
      }
    }

对于解决方案#1:执行了默认构造函数,无法启动/停止使用者
解决方案2:

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);
  }
}

对于解#2:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“org.springframework.kafka.config.abstractkafkalistenercontainerfactory”的合格bean可用:至少需要1个符合autowire候选的bean。依赖项注解:{}u2028,位于org.springframework.beans.factory.support.constructorresolver.createargumentarray(constructorresolver)。java:767)
如何在不破坏测试用例的情况下禁用kafka消费者自动启动?
更新:已从kafkaconsumercustomizer类中删除@component标记

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();
  }
}

它仍然抛出以下错误:
java:[49,12]com.xx类中的构造函数kafkaconsumercustomizer.kafkaconsumercustomizer不能应用于给定类型[error]必需:org.springframework.kafka.config.abstractkafkalistenercontainerfactory,boolean[error]找到:没有参数[error]原因:实际参数列表和形式参数列表的长度不同[error]->[help 1]

8ulbf1ek

8ulbf1ek1#

大概你的测试没有被标记 @SpringBootTest .
您可以添加 mock(AbstractKafkaListenerContainerFactory) bean到您的测试配置,或者不使用 @Component 在定制器上;而是添加一个 @Bean 在主配置中。
然后,在测试中通过组件扫描将找不到它。
在别的地方 @Configuration 类,添加

@Bean
KafkaConsumerCustomizer cust() {
    return new KafkaConsumerCustomizer();
}

或者。。。

@Bean
KafkaConsumerCustomizer cust(AbstractKafkaListenerContainerFactory<?, ?, ?> factory,
            @Value("${start.containers:true}") boolean start) {
    return new KafkaConsumerCustomizer(factory, start);
}

相关问题