第 31 章 SpEL

概述

Spring Expression Language (SpEL) 是 Spring 3 提供的对象图形导航语言,可用于在路由中构造 predicates 和表达式。SpEL 的一个显著功能是您可以从 registry 访问 Bean 的简易功能。

语法

SpEL 表达式必须使用占位符语法 #{SpelExpression},以便可以嵌入纯文本字符串(换句话说,SpEL 具有表达式模板)。

SpEL 还可以使用 @BeanID 语法在 registry (通常是 Spring registry)中查找 bean。例如,如果一个 bean 带有 ID、headerUtils,以及方法 count () (计算当前消息上的标头数量),您可以在 SpEL predicate 中使用 headerUtils bean,如下所示:

#{@headerUtils.count > 4}

添加 SpEL 软件包

要在路由中使用 SpEL,您需要将对 camel-spring 的依赖关系添加到项目中,如 例 31.1 “添加 camel-spring 依赖项” 所示。

例 31.1. 添加 camel-spring 依赖项

<!-- Maven POM File -->
<properties>
  <camel-version>2.21.0.fuse-750033-redhat-00001</camel-version>
  ...
</properties>

<dependencies>
  ...
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>${camel-version}</version>
  </dependency>
  ...
</dependencies>

变量

表 31.1 “SpEL 变量” 列出使用 SpEL 时可访问的变量。

表 31.1. SpEL 变量

变量类型描述

Exchange

当前交换是 root 对象。

交换

Exchange

当前交换。

exchangeId

字符串

当前交换的 ID。

exception

Throwable

交换异常(如果有)。

fault

消息

故障消息(如果有)。

Request (请求)

消息

交换的 In 消息。

response

消息

交换的 Out 消息(若有)。

属性

Map

Exchange 属性。

property (Name)

对象

由名称 键键的交换 属性

property (Name,Type)

类型

名称 密钥的交换属性,转换为类型类型。

XML 示例

例如,要只选择其 Country 标头具有值 USA 的消息,您可以使用以下 SpEL 表达式:

<route>
  <from uri="SourceURL"/>
  <filter>
    <spel>#{request.headers['Country'] == 'USA'}}</spel>
    <to uri="TargetURL"/>
  </filter>
</route>

Java 示例

您可以在 Java DSL 中定义相同的路由,如下所示:

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");