Spring boot org.springframework.messaging.converter.MessageConversionException

Spring boot org.springframework.messaging.converter.MessageConversionException,spring-boot,avro,spring-kafka,Spring Boot,Avro,Spring Kafka,使用Avro消息格式 低于异常。在反序列化之后,它无法映射到AvroPlanCompleteTrigger java对象。有人能帮忙吗 Bean[com.wom.repl.odr.receiver。Receiver@606b1c65]; 嵌套异常为org.springframework.messaging.converter.MessageConversionException:无法处理消息;嵌套异常为org.springframework.messaging.converter.Message

使用Avro消息格式

低于异常。在反序列化之后,它无法映射到AvroPlanCompleteTrigger java对象。有人能帮忙吗

Bean[com.wom.repl.odr.receiver。Receiver@606b1c65]; 嵌套异常为org.springframework.messaging.converter.MessageConversionException:无法处理消息;嵌套异常为org.springframework.messaging.converter.MessageConversionException:无法将GenericMessage[payload={“groupId”:609001,“runUUID”:“runUUID”,“wmtItemNumber”:“123456”,“sourceLocation”:987,“retryCount”:3,“应用程序名称”:“Jenkins”},标题={kafka_offset=0,kafka_receivedMessageKey=null,kafka_receivedPartitionId=0,kafka_receivedTopic=test3,kafka_确认=消费者确认记录(topic=test3,partition=0,offset=0,CreateTime=157476894315,checksum=2886880703,序列化键大小=1,序列化值大小=29,键=null,值={“groupId”:1234,“runUUID”:“runUUID”,“wmtItemNumber”:“123456”,“sourceLocation”:987,“retryCount”:3,“applicationName”:“Jenkins”}),failedMessage=GenericMessage[payload={”groupId“:1234,“runUUID”:“runUUID”,“wmtItemNumber”:“123456”,“sourceLocation”:987,“retryCount”:3,“applicationName”:“Jenkins”},headers={kafka\u receivedMessageKey=null,kafka\u receivedPartitionId=0,kafka\u receivedTopic=test3,kafka\u确认=对消费者的确认记录(topic=test3,partition=0,offset=0,CreateTime=157476894315,checksum=2886880703,序列化键大小=1,序列化值大小=29,键=null,值={“groupId”:609001,“runUUID”:“runUUID”,“wmtItemNumber”:“123456”,“sourceLocation”:987,“retryCount”:3,“applicationName”:“Jenkins”}],位于org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:178),位于org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:72),位于org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:47),位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokerRecordListener(KafkaMessageListenerContainer.java:794),位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:738),位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.access$2200(KafkaMessageListenerContainer.java:245),位于org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer$ListenerInvoker.run(KafkaMessageListenerContainer.java:1031),java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511),java.util.concurrent.FutureTask.FutureTask.run(Thread.java:748)]:结束

Pom依赖项版本:

<dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>1.2.2.RELEASE</version>
        </dependency>

<dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>1.9.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

org.springframework.kafka
春天卡夫卡
1.2.2.1发布
org.apache.avro
阿夫罗
1.9.1
slf4j api
org.slf4j
AvroDeserializer方法,下面我将使用它来获取AvroPlanCompleteTrigger这个java对象


    public T deserialize(String topic, byte[] data) {
        try {
            T result = null;

            if (data != null) {
                LOGGER.debug("data='{}'", DatatypeConverter.printHexBinary(data));

                DatumReader<GenericRecord> datumReader = new SpecificDatumReader<>(
                        targetType.newInstance().getSchema());
                Decoder decoder = DecoderFactory.get().binaryDecoder(data, null);

                result = (T) datumReader.read(null, decoder);
                LOGGER.debug("deserialized data='{}'", result);
            }
            return result;
        } catch (Exception ex) {
            throw new SerializationException(
                    "Can't deserialize data '" + Arrays.toString(data) + "' from topic '" + topic + "'", ex);
        }
    }


公共T反序列化(字符串主题,字节[]数据){
试一试{
T结果=null;
如果(数据!=null){
debug(“data='{}',DatatypeConverter.printHexBinary(data));
DatumReader DatumReader=新的指定DatumReader(
targetType.newInstance().getSchema());
Decoder Decoder=DecoderFactory.get().binaryDecoder(数据,null);
结果=(T)datumReader.read(null,解码器);
debug(“反序列化数据='{}',结果);
}
返回结果;
}捕获(例外情况除外){
抛出新的序列化异常(
“无法反序列化数据”“+数组。toString(数据)+”“来自主题”“+主题+”,ex);
}
}

看起来您已经反序列化了一个
com.wom.requirement.odr.dto.AvroPlanCompleteTrigger
,但是方法参数是一个
com.wom.repl.odr.dto.AvroPlanCompleteTrigger


Spring不知道如何从一个转换到另一个。

看起来您已经反序列化了
com.wom.requirement.odr.dto.AvroPlanCompleteTrigger
,但是方法参数是
com.wom.repl.odr.dto.AvroPlanCompleteTrigger


Spring不知道如何从一个转换到另一个。

是的,Gary。如何解决此问题?序列化和反序列化对象是相同的。您编辑了问题;我拒绝了您对我的答案的编辑,以使其与您的编辑一致。在原始问题中,第三个包元素与
补充
回复。这些类可能是相同的“形状”"但它们不是同一个类。在编辑问题之前,错误是明确的。如果您的原始问题在某种程度上是错误的,并且您的新问题是正确的,那么这可能是类加载器问题。奇怪的是,您的原始问题是您稍后编辑的异常的副本/粘贴。如果确实是相同的类,则它是正确的这很可能是一个类加载器问题。有没有办法解决这个问题?AvroPlanCompleteTrigger类对此也很确定。您需要弄清楚Kafka为什么使用不同的类加载器;一个解决方案可能是创建反序列化器,并使用一个替代构造函数将其注入到
DefaultKafkanConsumerFactory
,即您可以确保使用相同的类加载器来创建反序列化器和