我通过以下方法从kafka创建了Serde消费
import org.apache.kafka.connect.json.JsonDeserializer;
import org.apache.kafka.connect.json.JsonSerializer;
final Deserializer<JsonNode> jsonDeserializer = new JsonDeserializer();
final Serializer<JsonNode> jsonSerializer = new JsonSerializer();
final Serde<JsonNode> jsonNodeSerde = Serdes.serdeFrom(jsonSerializer, jsonDeserializer);
final StreamsBuilder builder = new StreamsBuilder();
final KStream<String, JsonNode> eventStream = builder
.stream("my-test-1",
Consumed.with(Serdes.String(), jsonNodeSerde)
但仍然收到序列化错误:
Caused by: org.apache.kafka.streams.errors.StreamsException: A serializer (key: org.apache.kafka.common.serialization.StringSerializer / value: org.apache.kafka.common.serialization.ByteArraySerializer) is not compatible to the actual key or value type (key type: java.lang.String / value type: com.fasterxml.jackson.databind.node.ObjectNode). Change the default Serdes in StreamConfig or provide correct Serdes via method parameters.
由于已经提供了Consumed.with()
,为什么仍使用默认Serde?作为这里写的答案,这应该行得通吗?
https://stackoverflow.com/a/48832957/3952994
答案 0 :(得分:2)
是的,问题在于您的数据与Serdes不匹配。
A serializer (key: org.apache.kafka.common.serialization.StringSerializer /
value: org.apache.kafka.common.serialization.ByteArraySerializer)
is not compatible to the actual key or value type
(key type: java.lang.String /
value type: com.fasterxml.jackson.databind.node.ObjectNode).
但是,错误消息指出问题是由于对数据进行序列化(即Kafka Streams尝试写入某个地方的数据)引起的。
您的带有Consumed
的代码段是关于反序列化,因此是读取数据。因此,问题似乎不是由您在问题中共享的代码段引起的,而是由Java文件中可能位于更下方的代码(问题中未显示)引起的。 (顺便说一句,如果您提供了错误的完整堆栈跟踪信息,将会有所帮助。)