【问题标题】:Deserialization in Spring CloudSpring Cloud 中的反序列化
【发布时间】:2018-06-18 19:03:00
【问题描述】:

我有一个内容类型配置如下的生产者

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

在消费者方面,我使用 spring 集成 (KinesisMessageDrivenChannelAdapter) 将事件路由到不同的通道。当我在侦听器类上收到消息时,如下所示:

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

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

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

感谢您的帮助。

谢谢

【问题讨论】:

    标签: spring-integration amazon-kinesis spring-cloud-stream spring-integration-aws


    【解决方案1】:

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

    SCSt 生产者将消息标头与有效负载一起序列化到 Kinesis 记录正文中的问题。仅仅因为 AWS Kinesis 本身不支持标头。

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

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

    否则,除非您手动使用 EmbeddedHeaderUtils,否则您将无法选择普通的 KinesisMessageDrivenChannelAdapter

    【讨论】:

    • 谢谢阿特姆!您是完全正确的,用户使用 Spring Cloud 进行生产和 Spring 集成对消费者而言没有多大意义。原因是我发现 spring cloud producer 易于用于测试目的。我只想将事件发布到流中。您对使用 Spring 集成的生产者端有什么建议吗?
    • KinesisMessageHandler @Bean@ServiceActivator 配置通道以发送到 AWS Kinesis。但是你快到了:只需在生产者端配置 headerMode: none
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多