其他分享
首页 > 其他分享> > 如何使用Object有效负载而不是MessageCollector中的字符串接收GenericMessage

如何使用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