当前位置: 首页 > 知识库问答 >
问题:

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

梁骞仕
2023-03-14

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

"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
}

通过使用聚合处理器的聚合器。聚合选项。文档指出,此属性的有效值是聚合策略的SpEL表达式,默认情况下,它会生成有效负载的集合。聚合器处理器的一个集成测试使用以下表达式:

#this.?[payload == 'foo'].![payload]

从单独的有效载荷“foo”和“bar”生成聚合消息“foo”。虽然测试非常有用,但文档中没有提供太多关于如何在Spring Cloud Stream Starter应用程序的上下文中使用SpEL表达式的示例,这很遗憾,因为我知道我错过了一个非常强大的功能。

使用如下所示的表达式:

 #this

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

有人能给我一些关于如何在这个处理器选项中使用SpEL表达式的例子吗?我正在尝试的是可能的吗?

共有1个答案

松景铄
2023-03-14

假设有效载荷是字符串...

尝试get(0). payload get(1). payload get(2). payload

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

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

编辑

不幸的是,聚合的#root对象是Collection

您可以用新java替换每个元素。util。ArrayList(#根)。获取(0)。负载等,但这相当难看(而且效率很低,因为您创建了一个新列表来获取每个元素)。我看看能不能想出更好的解决办法

编辑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));

生产

[foo, bar]

要移除牙套:

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

(只要JSON中没有[],在您的示例中就是这样)。

 类似资料:
  • 问题 如何在groovy Spring Boot项目中定义Spring表达式语言(SpEL)?(每个Spring调度器crontab@调度注释) Spring Boot Groovy和Spring EL调度器 根据来自web的文档,我正在groovy spring boot应用程序(2.2.x)中使用spring scheduler 根据这篇文章:任务调度使用cron表达式从属性文件 试过这个 我

  • 我们有几个域对象具有可为空的字段。我们已经读到hibernate需要“raw”对象来正确映射它,所以我们的getter返回optionals。我们的域对象如下所示: 但现在我们在解决/绑定这些字段时遇到了问题。jspx文件。(显示和表单输入字段。)对于基本类型和字符串,我们可以通过定义自定义OptionalToStringConverter绕过这一点。 对其他域对象的可空引用仍然是一个问题。 我们

  • 主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取

  • 问题内容: 我有以下Transact-Sql,我正尝试将其转换为LINQ …并正在挣扎。 任何帮助将不胜感激…如果可能的话,我想使用Lambda表达式来做。 提前致谢! 问题答案: GFrizzle击败了我。但是这是一个C#版本 作为奖励,还有纯LINQ方法链版本:

  • 6.3 使用SpEL的接口进行表达式求值 本节介绍SpEL接口及其表达式语言的简单使用方法。完整的语言文档见:Language Reference 下面代码介绍了使用SpEL API来解析字符串表达式’Hello World’的示例 ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parse