30.4. 表达式
概述
简单语言提供了各种元素表达式,可以返回消息交换的不同部分。例如,表达式 simple ("${header.timeOfDay}")
,将从传入消息返回名为 timeOfDay
的标头的内容。
由于 Apache Camel 2.9,您必须始终 使用占位符语法 ${Expression}
来返回变量值。省略没有遗漏了令牌(${
和 }
)。
单个变量的内容
您可以根据提供的变量,使用简单语言来定义字符串表达式。例如,您可以使用表单的变量 in.header.
HeaderName 来获取 HeaderName 标头的值,如下所示:
simple("${in.header.foo}")
嵌入在字符串中的变量
您可以将简单变量嵌入到字符串表达式的 except-OPTS 中,例如:
simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")
日期和时间和 bean 变量
除了提供访问交换不同部分的变量(请参阅 表 30.1 “简单语言的变量”),简单语言还为格式化日期、日期:
命令:
pattern、调用 Bean 方法(an: bean:
bean.)提供特殊变量。例如,您可以使用日期和 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 中,setHeader
和 setExchange
属性允许使用简单语言(如果键的名称是一个简单语言)的动态标头键。
<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>
嵌套表达式
简单表达式可以是嵌套的LogForwarder-指代,例如:
simple("${header.${bean:headerChooser?method=whichHeader}}")
访问常量或枚举
您可以使用以下语法访问 bean 的常数或 enum 字段:
type:ClassName.Field
例如,请考虑以下 Java 枚举
类型:
package org.apache.camel.processor; ... public enum Customer { GOLD, SILVER, BRONZE }
您可以访问 客户枚举
字段,如下所示:
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 Navigation Language (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 operator ?
以避免遇到 null-pointer 异常。例如:
simple("${body?.address?.street}")
如果正文为 java.util.Map
类型,您可以使用以下表示法在映射中查找一个值 foo
:
simple("${body[foo]?.name}")
OGNL 列表元素访问
您还可以使用方括号表示法 [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")