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
相关产品推荐
相关产品推荐

