Spring Kafka跨应用消费自定义类报不在信任包错误如何解决
问题根因
错误信息明确指向两个核心问题:
- 消费者反序列化时,生产者发送的
assignment2.kafka.Greeting不在消费者默认信任的包范围内 - 两端Greeting类包名不一致,同时序列化/反序列化配置存在冲突,且之前发送的无效消息滞留在Kafka分区中,会循环触发报错
修复步骤
1. 先清理存量无效消息
修改配置前先清理分区中已存在的错误消息,否则修改配置后依然会读取旧消息触发报错,可选方案:
- 删除
greetingTopic后重启Kafka自动重建 - 修改消费者的
group.id为新值,从最新offset开始消费 - 用Kafka自带命令行工具将对应分区的offset调整到最新位置
2. 修正生产者配置
你当前生产者配置中同时设置了ADD_TYPE_INFO_HEADERS=false和TYPE_MAPPINGS,二者存在冲突,关闭类型头后类型映射不会生效,直接删除greetingProducerFactory方法中的这行配置即可:
configProps.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, false);
3. 修正消费者配置
greetingConsumerFactory方法中需要修改3处配置:
- 类型映射改为消费者本地Greeting类的包路径,同时将配置键改为JsonDeserializer对应的属性:
原配置:
修改为:props.put(JsonSerializer.TYPE_MAPPINGS, "greeting:assignment2.kafka.Greeting");props.put(JsonDeserializer.TYPE_MAPPINGS, "greeting:ro.tuc.ds2020.kafkaconsumer.Greeting"); - 默认反序列化类型改为消费者本地Greeting类路径:
原配置:
修改为:props.put(JsonDeserializer.VALUE_DEFAULT_TYPE, "assignment2.kafka.Greeting");props.put(JsonDeserializer.VALUE_DEFAULT_TYPE, "ro.tuc.ds2020.kafkaconsumer.Greeting"); - 修正反序列化器配置,解决开头的ErrorHandlingDeserializer报错:
原有的反序列化器配置存在冲突,替换为以下配置:props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class); props.put(ErrorHandlingDeserializer.KEY_DESERIALIZER_CLASS, StringDeserializer.class); props.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, JsonDeserializer.class);
可选快速验证方案
如果需要快速验证功能,可直接在消费者配置中添加信任所有包的配置,跳过包名校验:
props.put(JsonDeserializer.TRUSTED_PACKAGES, "*");
所有配置修改完成后重启生产者和消费者应用即可正常收发Greeting消息。
内容的提问来源于stack exchange,提问作者Gloria
相关产品推荐
相关产品推荐

