如何使用对象有效负载而不是来自 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);
我尝试使用 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);