如何在Spring Cloud Stream aggregator处理器的aggregator.aggregation选项上使用SpEL表达式?

如何在Spring Cloud Stream aggregator处理器的aggregator.aggregation选项上使用SpEL表达式?,spring,spring-cloud-stream,spring-cloud-dataflow,Spring,Spring Cloud Stream,Spring Cloud Dataflow,我有三个单独的消息有效负载: "id": "1234" "type": "space-crite" "attributes": { "ferocity": 10, "appetite": 10, "cuddliness": 0 } 我想使用Spring Cloud Stream aggregator app starter处理器将这三个消息有效负载合并为一个: "id": "1234", "type": "space-crite", "attributes": { "fer

我有三个单独的消息有效负载:

"id": "1234"

"type": "space-crite"

"attributes": {
  "ferocity": 10,
  "appetite": 10,
  "cuddliness": 0
}
我想使用Spring Cloud Stream aggregator app starter处理器将这三个消息有效负载合并为一个:

"id": "1234",
"type": "space-crite",
"attributes": {
  "ferocity": 10,
  "appetite": 10,
  "cuddliness": 0
}
通过使用聚合处理器的aggregator.aggregation选项。文档中说,此属性的有效值是聚合策略的SpEL表达式,默认情况下,它生成有效负载的集合。聚合器处理器的一个集成测试使用以下表达式:

#this.?[payload == 'foo'].![payload]
从foo和bar的单独有效负载生成foo的聚合消息。 虽然测试非常有用,但文档中没有提供太多关于如何在SpringCloudStreamStarter应用程序的上下文中使用SpEL表达式的示例,这是一个遗憾,因为我知道我错过了一个非常强大的功能

使用如下所示的表达式:

 #this
aggregator.aggregation属性的值创建一个负载,该负载是GenericMessage对象的集合,每个对象都有自己的负载和头属性。我希望创建一个大小为1的GenericMessage,其有效负载属性包含3条传入消息


有人能给我举一些例子,说明如何将SpEL表达式与此处理器选项结合使用吗?我所尝试的可能吗

假设有效载荷是字符串

尝试get0.payload+get1.payload+get2.payload

如果要在有效载荷之间换行,请使用

T(String).format(get(0).payload + '%n' + get(1).payload + '%n' + get(2).payload)
编辑

不幸的是,聚合的根对象是一个集合>,因此上面的方法不起作用

您可以用新的java.util.ArrayListroot.get0.payload等替换每个元素,但这相当难看且效率低下,因为您创建了一个新列表来获取每个元素。我看看能不能想出更好的解决办法

编辑2

也许这会接近你想要的

#root.![payload].toString()
测试:

MessageGroup g = new SimpleMessageGroup("foo");
g.add(new GenericMessage<>("foo"));
g.add(new GenericMessage<>("bar"));
Collection<Message<?>> messages = g.getMessages();
Expression e = new SpelExpressionParser().parseExpression(
        "#root.![payload].toString()");
System.out.println(e.getValue(messages));
要卸下支架,请执行以下操作:

#root.![payload].toString().replaceAll('[\[\]]', '')

只要JSON中没有[],您的示例就是如此。

更新了我的第二次编辑以删除不需要的ArrayList。
#root.![payload].toString().replaceAll('[\[\]]', '')