繁体   English   中英

从Kafka Streams反序列化对象时出错

[英]Error While Deserializing object from Kafka Streams

在写主题时,在kafka流方面,我使用来自kafka的Serdes.String()序列化程序对窗口键[test_id@timestamp1/timestamp2]进行了序列化。 从另一个应用程序检索相同的密钥时,反序列化时出现以下错误

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
 at [Source: [B@37e7c0b2; line: 1, column: 1]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
        at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
        at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:60)
        at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2929)
        at TestAlert$3.extract(TestAlert.java:483)
        at TestAlert$3.extract(TestAlert.java:1)
        at org.apache.ignite.stream.StreamAdapter.addMessage(StreamAdapter.java:181)
        at org.apache.ignite.stream.kafka.KafkaStreamer.access$100(KafkaStreamer.java:47)
        at org.apache.ignite.stream.kafka.KafkaStreamer$1.run(KafkaStreamer.java:156)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

以下是我编写的用于序列化Windowed Key的代码。 这里的testWinAlerts是加窗后以<Windowd<String>>作为键的聚合结果

testWinAlerts.toStream((k,v)->k.toString()).filter((k,v)->{
                return (v!=null);}).to(Serdes.String(),aggrMessageSerde,"Some-Topic");

下面是解串器中用于再次将bytes []转换为String格式的键的代码。 其中,msg.key()[特定于Ignite]在主题使用后以字节格式提供密钥。

String windowKey = objectMapper.readValue(msg.key(), String.class); 

在进一步的测试中,我还尝试了在将Window String写入kafka主题之前,从“窗口字符串"@", "/", "[", "]"删除"@", "/", "[", "]"字符,然后它起作用的方法。 但是在实际实现中,我不想增加从字符串中删除这些字符的额外开销。 那么,如何删除此错误?

您正在使用StringSerde将输入序列化为字符串 ,但是随后尝试使用Jackson进行反序列化,Jackson希望将JSON字符串作为其输入。 常规字符串可以是任何系列的字符。 但是JSON字符串看起来像"string"按照定义,它以""开头和结尾。因此,您无法使用Jackson来反序列化任何字符串,在其序列化状态下,它必须以""开头和结尾。 为什么不只使用StringSerde反序列化密钥?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM