Spring Boot 2.4.7 Kafka消费出现MessageConversionException异常咨询
异常原因
- Kafka消息内置类型标识冲突:上游生产者发送该Topic消息时,序列化工具会自动将发送类的全限定名写入消息Header的
__TypeId__字段,当前消费的消息__TypeId__值为com.base.employee.dtos.employeeexecution.EmployeeExecutionEBO,是上游服务定义的类,你本地项目不存在该类。 - 反序列化配置优先级问题:Spring Kafka的
JsonMessageConverter反序列化时,会优先读取消息Header内的__TypeId__值匹配类,优先级高于你手动指定的PersonEBO反序列化目标类,导致触发类找不到异常。 - 自定义配置未生效:你自定义的Kafka监听容器工厂Bean名为
kafkaConsumer,但@KafkaListener注解中指定的containerFactory值为kafkaListenerContainerFactory(Spring默认容器工厂名),你写的自定义反序列化、异常处理配置完全没有生效。
解决方案
- 修正容器工厂引用:将
@KafkaListener注解的containerFactory属性值改为你自定义的Bean名kafkaConsumer,确保你的自定义配置生效。 - 移除多余的消息转换器配置:
ConcurrentKafkaListenerContainerFactory中factory.setMessageConverter(new JsonMessageConverter())这行代码会覆盖你配置的自定义反序列化规则,直接删除该行即可。你在JsonDeserializer构造时已经指定了PersonEBO.class且关闭了类型头读取(第二个参数为false),配置生效后就会直接用你指定的类反序列化。 - (可选)配置类型映射:如果需要保留类型头校验,可以在消费者配置中添加类型映射规则,将上游的类路径映射到本地类:
也可以直接在// 在consumerConfigs()方法中添加如下配置 props.put(JsonDeserializer.TYPE_MAPPINGS, "com.base.employee.dtos.employeeexecution.EmployeeExecutionEBO:com.base.person.dtos.personexecution.PersonEBO");@KafkaListener的properties属性中添加配置:"spring.json.type.mapping=com.base.employee.dtos.employeeexecution.EmployeeExecutionEBO:com.base.person.dtos.personexecution.PersonEBO"
内容的提问来源于stack exchange,提问作者Vikram Srinivasan
相关产品推荐
相关产品推荐

