我尝试使用spring-cloud-stream测试通过MessageCollector发送和接收的消息。

当我将 native 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

最佳答案

但这是正确的。该 channel 用于output到消息传递代理。因此,我们刚刚将您的payload序列化为JSON,就可以将其交付了。这就是为什么您在生产中使用一切正常的原因,因为您之间有一个消息传递代理,而另一侧是input的正确反序列化器。这种messageCollector方法正好用于断言我们将要发送给代理的内容,因此添加一些其他反序列化功能超出了此实用程序的范围。

我只建议您在从收集器接收到ObjectMapper后直接在payload上使用Jackson 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);

09-28 13:05