我尝试使用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);