Spring Boot集成Spring Cloud Stream Kafka出现setAckOnError方法不存在报错
问题原因
该错误是典型的Spring官方组件版本不兼容导致的NoSuchMethodError类异常:
- 你使用的Spring Cloud 2020.0.3-SNAPSHOT版本对应的Spring Cloud Stream Kafka Binder,底层依赖
spring-kafka 2.6.x版本,该版本的org.springframework.kafka.listener.ContainerProperties类中存在setAckOnError方法 - Spring Boot 2.5.0默认管理的
spring-kafka版本为2.7.x,该版本重构了错误处理逻辑,直接移除了setAckOnError方法 - 应用启动时类加载器优先加载了Spring Boot管理的高版本
spring-kafka,Kafka Binder调用已被删除的方法时就会抛出该异常
解决方案
提供两种经过验证的可行方案,选择任意一种即可:
方案1:降级Spring Boot版本(最稳妥)
Spring Cloud 2020.0.x(代号Ilford)官方适配的Spring Boot版本为2.4.x,直接将pom.xml中parent的版本修改为2.4.x系列最新稳定版即可,无需修改其他配置:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.13</version> <relativePath/> </parent>
方案2:手动指定兼容的spring-kafka版本(保留Spring Boot 2.5.x)
如果必须使用Spring Boot 2.5.x版本,可以在pom.xml的properties节点中手动指定spring-kafka的兼容版本,覆盖Spring Boot默认的版本管理规则:
<properties> <java.version>11</java.version> <spring-cloud.version>2020.0.3-SNAPSHOT</spring-cloud.version> <!-- 新增以下配置,指定spring-kafka版本为2.6.x系列最新稳定版 --> <spring-kafka.version>2.6.11</spring-kafka.version> </properties>
额外优化建议
你当前pom.xml中单独引入了spring-kafka依赖,该依赖会由spring-cloud-stream-binder-kafka自动传递引入,可以直接删除该显式依赖,减少版本冲突概率。
修改完成后可执行mvn dependency:tree命令查看spring-kafka的实际引入版本,确认是2.6.x系列即为修复成功。
内容的提问来源于stack exchange,提问作者Amir Choubani
相关产品推荐
相关产品推荐

