错误提示:

kafka Cannot convert from [java.lang.String] to [io.popoo.ad.event.AdClickedEvent] for GenericMessage

解决方案:

这个错误通常发生在使用Kafka Consumer接收消息时,没有正确地配置value.deserializer属性。

Kafka Consumer需要将从Kafka Broker接收到的消息反序列化为Java对象,而value.deserializer属性用于指定反序列化器的类名。如果未正确配置该属性,则会抛出类似于以下的异常:

org.springframework.messaging.converter.MessageConversionException: Cannot convert from [java.lang.String] to [io.popoo.ad.event.AdClickedEvent] for GenericMessage
...
Caused by: org.springframework.kafka.support.serializer.DeserializationException: Failed to deserialize payload. Is the value a serialized payload?...

该异常表明,Kafka Consumer尝试将一个字符串类型的消息转换为io.popoo.ad.event.AdClickedEvent类型的Java对象,但是没有正确的反序列化器。

要解决这个问题,需要将value.deserializer属性设置为正确的反序列化器类。例如,如果要将消息反序列化为JSON格式的Java对象,则可以使用org.springframework.kafka.support.serializer.JsonDeserializer类。在Spring Boot中,可以在application.propertiesapplication.yml文件中添加以下配置:

spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties.spring.json.trusted.packages=*

这将使Kafka Consumer使用JsonDeserializer将消息反序列化为JSON格式的Java对象,并将io.popoo.ad.event包设置为可信任的包。如果反序列化的Java对象不在该包下,则会抛出ClassCastException异常。

需要注意的是,value.deserializer属性的值必须是实现了org.apache.kafka.common.serialization.Deserializer接口的类名。如果使用了第三方反序列化器,也需要确保该反序列化器实现了该接口。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐