如何使用Object有效负载而不是MessageCollector中的字符串接收GenericMessage

时间:2017-09-27 17:25:30

标签: java spring spring-cloud spring-cloud-stream spring-messaging

我尝试使用spring-cloud-stream通过MessageCollector测试邮件发送和接收。

当我使用本机java序列化进行流云时,一切正常,但当我将序列化更改为json时,MessageCollector返回GenericMessage,其中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有效负载的MessageCollector

生产环境工作正常,没有明确映射到SomeObject

1 个答案:

答案 0 :(得分:2)

但那是对的。该通道用于消息代理的output。因此,我们已将您的payload序列化为JSON,并且已准备好交付。这就是为什么你在生产中使用一切正常的原因,因为你之间有一个消息代理,另一方面有input的正确反序列化器。这种messageCollector方法完全用于断言我们要发送给代理的内容,因此添加一些额外的反序列化功能超出了该实用程序的范围。

我建议你只是在收到ObjectMapper之后直接在payload上使用杰克逊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);