第 31 章 SpEL
概述 复制链接链接已复制到粘贴板!
Spring Expression Language(SpEL) 是随 Spring 3 提供的对象图形导航语言,可用于在路由中构造 predicates 和表达式。SpEL 的显著功能是如何从 registry 访问 Bean 的简易功能。
语法 复制链接链接已复制到粘贴板!
SpEL 表达式必须使用占位符语法 #{SpelExpression}
以便将其嵌入到纯文本字符串中(换句话说,SpEL 已启用表达式模板)。
SpEL 也可以在 registry 中查找 Bean(通常是 Spring registry),使用 @BeanID
语法。例如,给定一个带有 ID、headerUtils
和 方法的 bean(它计算当前消息中的标头数量),您可以在 SpEL predicate 中使用 headerUtils
bean,如下所示:
#{@headerUtils.count > 4}
#{@headerUtils.count > 4}
添加 SpEL 软件包 复制链接链接已复制到粘贴板!
要在路由中使用 SpEL,您需要在您的项目中添加对 camel-spring
的依赖,如 例 31.1 “添加 camel-spring 依赖项” 所示。
例 31.1. 添加 camel-spring 依赖项
变量 复制链接链接已复制到粘贴板!
表 31.1 “SpEL 变量” 列出在使用 SpEL 时可访问的变量。
变量 | 类型 | 描述 |
---|---|---|
|
| 当前交换是 root 对象。 |
|
| 当前交换。 |
|
| 当前交换的 ID。 |
|
| 交换例外(如果有)。 |
|
| 故障消息(若有)。 |
|
| 交换的 In 消息。 |
|
| 交换的 Out 消息(若有)。 |
|
| 交换属性。 |
|
| 交换属性由 名称 键。 |
|
| 由 名称 键的交换属性转换为类型,Type。 |
XML 示例 复制链接链接已复制到粘贴板!
例如,要仅选择其 country 标头拥有值 USA
的消息,您可以使用以下 SpEL 表达式:
Java 示例 复制链接链接已复制到粘贴板!
您可以在 Java DSL 中定义相同的路由,如下所示:
from("SourceURL") .filter().spel("#{request.headers['Country'] == 'USA'}") .to("TargetURL");
from("SourceURL")
.filter().spel("#{request.headers['Country'] == 'USA'}")
.to("TargetURL");
以下示例演示了如何在纯文本字符串中嵌入 SpEL 表达式:
from("SourceURL") .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")) .to("TargetURL");
from("SourceURL")
.setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}"))
.to("TargetURL");