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