【问题标题】:How to deserialize Json string from Kafka topic in spring boot如何在 Spring Boot 中反序列化来自 Kafka 主题的 Json 字符串
【发布时间】:2020-03-27 16:54:24
【问题描述】:

我创建了一个 POJO 来映射从 Kafka 主题接收到的有效负载。 如果payload的格式为:

{"payload":{"name":notification,"key":"2637","message":"This is a notif"}

当我生成这条 JSON 字符串类型的消息时。

"{\"payload\":{\"name\":\"notification\",\"key\":\"2637\",\"message\":\"This is a notif\"}"

它在扔

无法读取 JSON:无法构造 myfilename 的实例:没有用于从字符串值反序列化的 sting-argument 构造函数/工厂方法。

如何解决?

【问题讨论】:

  • 根据日志,您的 POJO 类缺少参数化构造函数。尝试添加它。
  • 你需要展示你的实际代码。
  • 你现在做的映射怎么样?你还有更多代码吗?

标签: java spring spring-boot serialization spring-kafka


【解决方案1】:

如果消息只是表示转义 JSON 的字符串,我认为您只需要使用 StringDeserializer,并将消息作为字符串处理。我认为您不能自动绑定到 POJO,因为它不是实际的 JSON 对象。

您可以编写自定义反序列化器来转换字符串,然后委托给 ObjectMapper。

【讨论】:

  • 但是,如果您正在使用转义的 JSON(我对您的问题的理解),可能值得与负责生成这些消息的人交谈。
  • 谢谢,我同意。我将反序列化 JSON 并直接传递该消息。感谢您的建议。
【解决方案2】:

您的问题可能可以通过在映射器中使用以下设置来解决:

mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

附带说明,如果您已经在使用spring-kafka,则可以使用默认的JsonDesrializer 或自定义解串器。

consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);

spring documentation 中提供了更多文档

另一个参考:Deserialize kafka messages in KafkaConsumer using springboot

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 2020-02-20
    • 2019-06-17
    • 1970-01-01
    • 2020-12-15
    • 2019-11-25
    • 2018-10-20
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多