Spring Cloud Kafka反序列化Avro消息报ClassCastException
问题根因
从异常堆栈可以直接定位核心问题:全限定名完全相同的com.example.schema.avro.Event类被两个不同的类加载器加载,JVM不允许不同类加载器加载的类互相强转:
- 一份Event类被应用主类加载器
app加载 - 另一份Event类被Spring Boot DevTools热重启模块的
RestartClassLoader加载
你之前配置specific.avro.reader: true没有效果,是因为问题根源不在Avro反序列化参数配置,而在类加载隔离、多组件冲突、版本不兼容三个层面。
排查思路
按优先级从高到低排查:
- 第一步确认项目是否引入
spring-boot-devtools热部署依赖,该类双加载异常是DevTools类加载隔离机制的典型问题 - 第二步检查项目中是否同时存在多套Avro序列化/反序列化实现,不同实现的类加载逻辑不一致会触发跨类加载器类型转换
- 第三步核对Avro相关依赖、Maven插件的版本,大版本不匹配会导致类生成、加载逻辑异常
- 第四步检查Avro生成类的输出目录是否被重复纳入类路径,导致同一份类被多次加载
可行解决方案
方案1:解决DevTools类加载隔离问题(最快修复)
如果需要保留DevTools热部署能力,在src/main/resources下新建META-INF/spring-devtools.properties文件,添加配置将Avro相关依赖、生成类统一纳入RestartClassLoader的加载范围,避免跨类加载器调用:
# 包含Avro核心依赖 restart.include.avro=/avro-[0-9].*\.jar # 包含Confluent Avro序列化器 restart.include.confluent=/kafka-avro-serializer-[0-9].*\.jar # 包含Avro插件生成的源码编译产物 restart.include.avro-generated=/com/example/schema/avro/.*
如果不需要热部署能力,直接将pom中的spring-boot-devtools依赖移除,或者设置<optional>true</optional>排除其运行时影响,即可彻底消除类加载器不一致问题。
方案2:清理冲突的Avro序列化逻辑
你当前配置同时启用了两套独立的Avro处理逻辑,很容易触发类加载冲突:
- 一套是Kafka binder配置中指定的Confluent原生
KafkaAvroSerializer/KafkaAvroDeserializer - 另一套是手动注册的
ConfluentSchemaRegistryClient、AvroSchemaMessageConverter,以及低版本spring-cloud-stream-schema自带的序列化逻辑
两套逻辑二选一即可,不要并存: - 选择Confluent原生序列化方案:删除手动注册的
SchemaRegistryClient、AvroSchemaMessageConverter两个Bean,从pom中移除spring-cloud-stream-schema依赖,完全用binder中配置的Confluent序列化器处理消息 - 选择Spring Cloud Stream原生Avro方案:删除binder配置中指定的Confluent序列化/反序列化器参数,移除Confluent序列化器依赖,统一用Spring Cloud Stream内置的Avro消息转换器处理逻辑
方案3:修复版本不兼容问题
你当前的依赖版本存在明显的兼容性问题:
avro-maven-plugin版本为1.8.2,但是运行时引入的avro依赖版本为1.11.0,跨了3个大版本,插件生成的Java类和运行时类库逻辑不匹配spring-cloud-stream-schema版本为2.2.1.RELEASE,和你使用的spring-cloud-stream-binder-kafka 3.2.4版本跨了2个大版本,内置的类加载逻辑存在兼容问题
修复方式:- 将
avro-maven-plugin版本调整为和avro依赖一致的1.11.0,保证生成类和运行时类库逻辑匹配 - 移除单独引入的低版本
spring-cloud-stream-schema依赖,Spring Cloud Stream 3.2.x版本已经内置对应Schema支持,不需要单独引入旧版本包
验证方式
修改完成后完全停止应用进程,不要用DevTools热重载触发重启,冷启动后发送测试消息,消费逻辑不再抛出ClassCastException即为修复成功。
内容的提问来源于stack exchange,提问作者user1298426
相关产品推荐
相关产品推荐

