org.apache.kafka.common.errors.SerializationException与org.w3c.dom.Element字段

时间:2019-03-15 13:14:14

标签: json spring apache-kafka jackson marshalling

我尝试将消息发送到kafka,并在其他服务中获取此消息。我添加

org.springframework.kafka.support.serializer.JsonDeserializer //consumer side
org.springframework.kafka.support.serializer.JsonSerializer //produser side

然后尝试发送带有字段的对象:

org.w3c.dom.Element;

@XmlAnyElement
protected Element any;

消息发送成功,但是在消费者方面我收到错误消息:

Caused by: org.apache.kafka.common.errors.SerializationException: Can't deserialize data [[123, 34, 114, 101...

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Problem deserializing property 'any' (expected type: [simple type, class org.w3c.dom.Element]; actual type: `com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl`), problem: java.lang.ClassCastException@4db05b26

我通过以下命令在topik中显示此消息:

./kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic  --from-beginning

此消息看起来正确:

"to": "eyJzaWQi...",
 "messagePrimaryContent": {
    "any": "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<ImportCh...(another xml text)"
 },
 "personalSignature": null,

如何反序列化此消息?

如果我在没有org.w3c.dom.Element的情况下发送了该对象,则所有工作正常。

1 个答案:

答案 0 :(得分:0)

由于错误的方案,反序列化 123、34、114、101 中的记录存在问题。在消费者方面,您有不同的反序列化格式。 您可以通过进行一些 try-catch 和避免此类记录来避免这些数据,或者在消费者端更改为正确的方案。

避免错误方案记录的代码。

try {
                    records = consumer.poll(10000);
                } catch (SerializationException e) {
                    String s = e.getMessage().split("Error deserializing key/value for partition ")[1].split(". If needed, please seek past the record to continue consumption.")[0];
                    String topics = s.split("-")[0];
                    int offset = Integer.valueOf(s.split("offset ")[1]);
                    int partition = Integer.valueOf(s.split("-")[1].split(" at")[0]);

                    TopicPartition topicPartition = new TopicPartition(topics, partition);
                    //log.info("Skipping " + topic + "-" + partition + " offset " + offset);
                    consumer.seek(topicPartition, offset + 1);
                }