Spring 云中的反序列化

Deserialization in Spring Cloud

我有一个内容类型配置如下的制作人

spring:
  cloud:
    stream:
      bindings:
        eventOut:
          destination: lab_csi
          content-type: application/json

在消费者方面,我使用 spring 集成 (KinesisMessageDrivenChannelAdapter) 将事件路由到不同的 channels.When 我在监听器 class 上收到消息,如下所示:

@ServiceActivator(inputChannel = "channelA")
    void handleMessage(Message<?> msg) {
        objectMapper.readValue(msg.getPayload(), MyEvent.class);
    }

编组到 MyEvent 失败。在堆栈错误中,我可以看到内容类型是有效负载的一部分,并且有效负载仍未从 json 反序列化为 POJO。

我想知道如何在进行任何其他转换之前反序列化消息。我找不到任何可以将 MessageConverter 设置为适配器的方法。

感谢您的帮助。

谢谢

听起来您的生产者是 Spring Cloud Stream,但消费者只是普通的 KinesisMessageDrivenChannelAdapter。不清楚为什么不使用 Spring Cloud Stream 消费者,但无论如何......

您的问题是 SCSt 生产者将消息 headers 连同有效负载一起序列化到 Kinesis 记录 body 中。仅仅因为 AWS Kinesis 本身不支持 headers。

如果您真的对消费者端的 headers 不感兴趣,您可以禁用生产者端的嵌入 headers:

spring:
  cloud:
    stream:
      bindings:
        eventOut:
          destination: lab_csi
        producer:
        headerMode: none

否则,除非您手动使用 EmbeddedHeaderUtils,否则您在普通 KinesisMessageDrivenChannelAdapter 方面别无选择。