如何根据 Spring Kafka 中 payload 中的一个字段值进行反序列化?

how to deserialize based on one field value in payload in Spring Kafka?

我需要从 kafka 使用不同类型的相同主题。不同类型的含量略有不同。但它们是不同的。在消息的有效负载中,有一个名为 type 的字段可以确定应该将其反序列化为哪种 javatype。 这对我来说有点困难,因为要获取 'type' 的字段值。我已经需要反序列化了。

有什么好的方法可以用 spring kafka 做到这一点? 提前致谢。

正如 Artem Bilan 在评论中指出的那样,如果您在问题中添加更多详细信息,会更容易提供帮助。我会尝试通过做一些假设来提供帮助。

当使用 Avro 时,不同负载类型的反序列化应该首先由 schema-registry 处理(并强制执行),例如记录在案的 here,这似乎不是与有效载荷内的类型信息兼容,所以我假设你在谈论 JSON 有效载荷。

如果可能,您应该更改设计以在 record headers 中包含此类元数据 - 这样您就无需反序列化有效负载即可访问它,并且可以使用 Spring Kafka 内置工具,例如 DelegatingDeserializer.

考虑到两个初始假设都是正确的 - 您正在使用 JSON 并且不能更改设计以将 headers 用于类型元数据,您应该能够实现自定义 JsonTypeResolver to be set on the JsonDeserializer, where you can use an ObjectMapper to deserialize the payload to, for example, a Map - you can then fetch the type information from there and associate it with the proper JavaType.

编辑:一个更高效的解决方案是实现自定义反序列化器,您可以在其中使用“ObjectMapper”中的“readTree”方法将有效负载反序列化为“JsonNode”。然后,您可以遍历此对象以获取类型信息,并使用“treeToValue”方法继续将 json 节点反序列化为正确的类型。这样你就只反序列化一次。