代码之家  ›  专栏  ›  技术社区  ›  Bukharov Sergey

如何从MessageCollector接收具有对象负载而不是字符串的GenericMessage

  •  5
  • Bukharov Sergey  · 技术社区  · 9 年前

    我尝试通过 spring-cloud-stream 使用 MessageCollector .

    当我为流云使用本机java序列化时,一切正常,但当我将序列化更改为json时,MessageCollector返回带有 string 有效载荷,而不是 SomeObject 有效载荷。

    配置为

      cloud.stream.default.contentType=application/json 
    

    测试用例:

        Message outMsg = new GenericMessage<SomeObject>(new SomeObject(1));
        someChannel.send(outMsg);
        GenericMessage<SomeObject> inMsg = (GenericMessage<SomeObject>) messageCollector.forChannel(someChannel).poll();
    
        Assert.assertTrue(inMsg.getPayload() instanceof SomeObject);
    

    因此,断言是错误的。 inMsg 包含字符串负载(该字符串包含SomeObject的有效json表示)。

    我的问题是: GenericMessage 使用来自的SomeObject负载 消息收集器 ?

    生产环境运行良好,无需显式映射到 SomeObject对象 .

    1 回复  |  直到 9 年前
        1
  •  5
  •   orirab    7 年前

    但这是正确的。该频道用于 output 发送到消息传递代理。所以,我们刚刚序列化了您的 payload 输入JSON,就可以交付了。这就是为什么在生产中使用一切OK,因为中间有一个消息传递代理和适当的反序列化程序 input messageCollector 这种方法正是为了断言我们要发送给代理的内容,所以添加一些额外的反序列化功能超出了此实用程序的范围。

    我唯一建议你的是使用Jackson ObjectMapper 直接在 有效载荷 收到后 inMsg 从收集器:

    Message outMsg = new GenericMessage<SomeObject>(new SomeObject(1));
    someChannel.send(outMsg);
    GenericMessage<String> inMsg = (GenericMessage<String>) messageCollector.forChannel(someChannel).poll();
    SomeObject someObject = new ObjectMapper().readValue(inMsg.getPayload(), SomeObject.class);
    
    Assert.assertTrue(someObject instanceof SomeObject);