有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从MessageCollector接收带有对象负载而不是字符串的GenericMessage

我尝试使用MessageCollector测试通过spring-cloud-stream发送和接收消息

当我对流云使用本机java序列化时,一切正常,但当我将序列化更改为json时,MessageCollector返回带有string负载而不是SomeObject负载的GenericMessage

配置是

  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


共 (1) 个答案

  1. # 1 楼答案

    但这是正确的。该通道用于output到消息传递代理。所以,我们刚刚将您的payload序列化为JSON,现在就可以交付了。这就是为什么要在生产中使用一切OK,因为中间有一个消息代理,另一端有一个适当的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);