【问题标题】:required a bean of type 'org.springframework.kafka.core.KafkaTemplate' that could not be found需要一个找不到的“org.springframework.kafka.core.KafkaTemplate”类型的bean
【发布时间】:2020-07-06 10:07:39
【问题描述】:

我正在使用 spring boot,apache kafka。

下面是我的控制器代码

package com.infy.controller;

@RestController
@RequestMapping(value = "/serving/")
public class ServingRequestWebControllerImpl implements ServingRequestWebController {

    private static final Logger logger = LoggerFactory.getLogger(ServingRequestWebControllerImpl.class);

    @Autowired
    KafkaTemplate<String, TaskDetailsEntity> kafkaJsontemplate;

    String TOPIC_NAME = "sample-topic";

    @Override
    @PostMapping(value = "/produce", consumes = { "application/json" }, produces = { "application/json" })
    public String taskQueue(TaskDetailsEntity taskgDetailsEntity) {
        kafkaJsontemplate.send(TOPIC_NAME, taskgDetailsEntity);
        return "Serving Request Published Successfully To:- " + TOPIC_NAME;
    }
}

以下是Kafka配置代码

package com.infy.config;
@Configuration
public class KafkaConfig {

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        return new DefaultKafkaProducerFactory(config);
    }

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<String, String>(producerFactory());
    }

    public ProducerFactory<String, ServingDetailsEntity> producerFactoryServingDetail() {
        Map<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        return new DefaultKafkaProducerFactory(config);
    }

    @Bean
    public KafkaTemplate<String, ServingDetailsEntity> kafkaTemplateServingDetailsListener() {
        return new KafkaTemplate<String, ServingDetailsEntity>(producerFactoryServingDetail());
    }

    @Bean
    public ConsumerFactory<String, ServingDetailsEntity> consumerFactory() {
        Map<String, Object> config = new HashMap<>();
        config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
        config.put(ConsumerConfig.GROUP_ID_CONFIG, "event-group");
        config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        return new DefaultKafkaConsumerFactory<>(config, new StringDeserializer(),
                new JsonDeserializer<>(ServingDetailsEntity.class));
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, ServingDetailsEntity> kafkaTemplateTaskDetailsListener() {
        ConcurrentKafkaListenerContainerFactory<String, ServingDetailsEntity> factory = new ConcurrentKafkaListenerContainerFactory<String, ServingDetailsEntity>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }
}

下面是我的消费者代码

package com.infy.consumer;
@Service
public class KafkaConsumerService {

    private static final Logger logger = LoggerFactory.getLogger(KafkaConsumerService.class);

    @Autowired
    private ServingService service;

    @KafkaListener(topics = "sample-topic", groupId = "event-group",containerFactory = "kafkaTemplateTaskDetailsListener")
    public void consumeTask(TaskDetailsEntity taskDtls){
        System.out.println("Consumed Message:- \n "+taskDtls);

        TaskDetailsEntity upsert = service.taskUpsert(taskDtls);
        System.out.println(upsert.getId());
        logger.info("\n Exit KafkaConsumerService consumeTask");
    }
}

当我运行我的 Spring Boot 应用程序时,我遇到了错误

说明: com.infy.controller.ServingRequestWebControllerImpl 中的字段 kafkaJsontemplate 需要找不到类型为“org.springframework.kafka.core.KafkaTemplate”的 bean。 注入点有以下注解: -@org.springframework.beans.factory.annotation.Autowired(required=true) 找到了以下候选但无法注入: - 'KafkaAutoConfiguration' 中的 Bean 方法 'kafkaTemplate' 未加载,因为自动配置 'KafkaAutoConfiguration' 被排除在外 行动: 考虑重新访问上面的条目或在您的配置中定义类型为“org.springframework.kafka.core.KafkaTemplate”的 bean。

我尝试将以下配置添加到 application.properties,但没有运气

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration

下面是我的spring boot主要代码

package com.infy;

@SpringBootApplication
public class SpringBootInitializer {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootInitializer.class, args);
    }
}

请有人帮助我,我犯了什么错误。

【问题讨论】:

  • 你能不能在上面的类中提到包,你也可以告诉你主要的应用程序类和包名。
  • @GauravDhiman 问题已编辑
  • 不确定是否是导致该问题的原因,但如果您希望您的听众正常工作,您将需要一个 EnableKafka 注释。这可能是问题所在 - 老实说,我不记得生产者方面是否需要它。
  • 可能把它放在你的 KafkaConfig 类中
  • 我还注意到您正在尝试为 TaskDetailsEntity 值自动装配 KafkaTemplate,但在您的配置中,您正在为 ServingDetailsEntity 值声明一个 KafkaTemplate bean

标签: spring-boot apache-kafka


【解决方案1】:

您想自动连接 KafkaTemplate&lt;String, TaskDetailsEntity&gt; 类型的 bean, 但是您只在 KafkaConfig 中声明了 KafkaTemplate&lt;String, String&gt;KafkaTemplate&lt;String, ServingDetailsEntity&gt; 类型的 bean。

producerFactory()@Bean 注释而 producerFactoryServingDetail() 没有注释可能也是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2017-09-17
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多