You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3迁移:ListenableFutureCallback转BiConsumer报错求助

Spring Boot 3 Kafka回调适配问题解决

问题背景

在将原有Java代码迁移到Spring Boot 3时,调用Kafka发送方法出现类型不匹配错误:原代码使用ListenableFutureCallback作为回调,但目标方法要求BiConsumer<SendResult<K, V>, Throwable>类型参数,导致编译报错。

原核心代码:

import java.util.function.BiConsumer;

public void send(String topic, K key, V message, BiConsumer<SendResult<K, V>, Throwable> callback) {
    CompletableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
    if (Objects.nonNull(callback)) {
      future.whenComplete(callback);
    }
}

// 调用代码
kafkaProducer().send("topic", "key", "messge", listenableFutureCallback("12345"));

// 原有回调方法
private ListenableFutureCallback listenableFutureCallback(String userId) {
    return new ListenableFutureCallback() {
      @Override
      public void onFailure(Throwable ex) {
        // 失败逻辑
      }

      @Override
      public void onSuccess(Object result) {
        // 成功逻辑
      }
    };
}

错误信息

Cannot find required type
Required type: BiConsumer <org.springframework.kafka.support.SendResult<java.lang.String,java.lang.String>,
java.lang.Throwable>
Provided: ListenableFutureCallback

解决方案:将回调改造为返回BiConsumer类型

直接修改listenableFutureCallback方法,使其返回BiConsumer类型,适配CompletableFuture.whenComplete的参数要求,同时补充泛型保证类型安全:

方式1:匿名内部类实现

private BiConsumer<SendResult<String, String>, Throwable> listenableFutureCallback(String userId) {
    return new BiConsumer<>() {
        @Override
        public void accept(SendResult<String, String> result, Throwable ex) {
            if (ex != null) {
                // 原有onFailure逻辑迁移至此处
                return;
            }
            // 原有onSuccess逻辑迁移至此处,result为明确类型的SendResult对象
        }
    };
}

方式2:Lambda表达式简化(推荐)

private BiConsumer<SendResult<String, String>, Throwable> listenableFutureCallback(String userId) {
    return (result, ex) -> {
        if (ex != null) {
            // 失败处理逻辑
            return;
        }
        // 成功处理逻辑,可直接调用result的方法如result.getRecordMetadata()
    };
}

关键说明

  • Spring Boot 3中KafkaTemplate的send方法返回CompletableFuture,不再是ListenableFuture,因此需使用CompletableFuture的whenComplete方法,该方法仅接受BiConsumer类型回调。
  • 明确泛型类型SendResult<String, String>可避免类型转换问题,保证编译阶段的类型安全。

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:19