如何使用Object有效负载而不是MessageCollector中的字符串接收GenericMessage
作者:互联网
我尝试使用MessageCollector测试通过spring-cloud-stream发送和接收消息.
当我使用本机java序列化的流云时,一切正常,但当我将序列化更改为json时,MessageCollector返回GenericMessage与字符串有效负载而不是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.
解决方法:
但那是对的.该通道用于输出到消息传递代理.因此,我们已将您的有效负载序列化为JSON,并且已准备好交付.这就是为什么你在生产中使用一切正常的原因,因为你之间有一个消息代理和另一方面的输入正确的反序列化器.这个messageCollector方法完全用于断言我们要发送给代理的内容,因此添加一些额外的反序列化功能超出了该实用程序的范围.
我建议你只是从收集器收到inMsg后直接在有效载荷上使用Jackson ObjectMap:
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);
标签:java,spring,spring-cloud-2,spring-cloud-stream,spring-messaging 来源: https://codeday.me/bug/20190701/1348846.html