如何使用对象有效负载而不是来自 MessageCollector 的字符串接收 GenericMessage

How to receive GenericMessage with Object payload instead of string from MessageCollector

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

当我为流云使用原生 java 序列化时一切正常,但是当我将序列化更改为 json 时,MessageCollector returns me GenericMessage with string payload而不是 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 表示)。

我的问题是: 我如何从 MessageCollector 接收带有 SomeObject 负载的 GenericMessage

生产环境在没有显式映射到 SomeObject.

的情况下工作正常

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

我只能建议你在收到来自收集器的 inMsg 后直接在 payload 上使用 Jackson ObjectMapper:

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);