30.4. 表达式

概述

简单语言提供了返回消息交换不同部分的各种元素表达式。例如,表达式 ( simple("${header.timeOfDay}") 会从传入消息返回名为 timeOfDay 的标头的内容。

注意

自 Apache Camel 2.9 起,您必须始终 使用占位符语法 ${Expression},返回变量值。省略包含令牌(${})不可预见。

单个变量的内容

您可以根据提供的变量,使用简单的语言来定义字符串表达式。例如,您可以使用表单( in.header.HeaderName )的变量来获取 HeaderName 标头的值,如下所示:

simple("${in.header.foo}")

嵌入在字符串中的变量

您可以将简单变量嵌入到字符串表达式中,如:

simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")

日期和 bean 变量

还提供了访问交换的所有不同部分的变量(请参阅 表 30.1 “简单语言的变量”),简单语言还提供用于格式日期、日期:模式,以及调用 Bean 方法的变量,bean :bean Ref例如,您可以使用日期以及 bean 变量,如下所示:

simple("Todays date is ${date:now:yyyyMMdd}")
simple("The order type is ${bean:orderService?method=getOrderType}")

指定结果类型

您可以明确指定表达式的结果类型。这在将结果类型转换为布尔值或数字类型时特别有用。

在 Java DSL 中,将结果类型指定为 simple() 的额外参数。例如,要返回整数结果,您可以评估一个简单的表达式,如下所示:

...
.setHeader("five", simple("5", Integer.class))

在 XML DSL 中,使用 resultType 属性指定结果类型。例如:

<setHeader headerName="five">
  <!-- use resultType to indicate that the type should be a java.lang.Integer -->
  <simple resultType="java.lang.Integer">5</simple>
</setHeader>

动态标头密钥

在 Camel 2.17 中,如果键的名称为 Simple 语言,则 setHeadersetExchange 属性允许使用动态标头键。

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
      <setHeader headerName="$simple{type:org.apache.camel.spring.processor.SpringSetPropertyNameDynamicTest$TestConstans.EXCHANGE_PROP_TX_FAILED}">
        <simple>${type:java.lang.Boolean.TRUE}</simple>
      </setHeader>
    <to uri="mock:end"/>
  </route>
</camelContext>

嵌套表达式

简单的表达式可以是嵌套的、deploy-的、例如:

simple("${header.${bean:headerChooser?method=whichHeader}}")

访问常数或枚举

您可以使用以下语法访问 bean 的常数或枚举字段:

type:ClassName.Field

例如,请考虑以下 Java enum 类型:

package org.apache.camel.processor;
...
public enum Customer {
    GOLD, SILVER, BRONZE
}

您可以访问 客户 enum 字段,如下所示:

 from("direct:start")
    .choice()
        .when().simple("${header.customer} ==
          ${type:org.apache.camel.processor.Customer.GOLD}")
            .to("mock:gold")
        .when().simple("${header.customer} ==
          ${type:org.apache.camel.processor.Customer.SILVER}")
            .to("mock:silver")
        .otherwise()
            .to("mock:other");

OGNL 表达式

Object Graph 导航语言(OGNL)是以类似链的方式调用 Bean 方法的表示法。如果消息正文包含 Java bean,您可以使用 OGNL 表示法轻松访问其 bean 属性。例如,如果消息正文是具有 getAddress() accessor 的 Java 对象,您可以访问 Address 对象和 Address 对象的属性,如下所示:

simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")
simple("${body.address.city}")

其中表示法 ${body.address.street}${body.getAddress.getStreet} 的简写。

OGNL null-safe operator

您可以使用 null-safe 运算符 ?。 如果正文 没有 地址,则可以避免遇到 null-pointer 异常。例如:

simple("${body?.address?.street}")

如果正文是 java.util.Map 类型,您可以使用以下表示法在 map 中查找值 foo

simple("${body[foo]?.name}")

OGNL list 元素访问权限

您也可以使用方括号表示法 [k] 来访问列表的元素。例如:

simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")

last 关键字返回列表的最后一个元素的索引。例如,您可以访问列表 的第二个最后一个 元素,如下所示:

simple("${body.address.lines[last-1]}")

您可以使用 大小 方法查询列表的大小,如下所示:

simple("${body.address.lines.size}")

OGNL 阵列长度访问

您可以通过 长度 方法访问 Java 阵列的长度,如下所示:

String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);

simple("There are ${body.length} lines")