30.4. 表达式
概述
					简单语言提供各种元素表达式,可返回消息交换的不同部分。例如,表达式 simple ("${header.timeOfDay}") 将从传入的消息返回名为 timeOfDay 的标头的内容。
				
						从 Apache Camel 2.9 开始,您必须始终 使用占位符语法 ${Expression} 来返回变量值。不可遗漏地省略令牌(${ 和 })。
					
单个变量的内容
					您可以根据提供的变量,使用简单语言来定义字符串表达式。例如,您可以使用表单的变量 in.header.HeaderName 来获取 HeaderName 标头的值,如下所示:
				
simple("${in.header.foo}")
simple("${in.header.foo}")嵌入字符串中的变量
您可以将简单的变量嵌入到字符串 expressionsetuptools-criu 中,例如:
simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")
simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")日期和 bean 变量
					以及提供访问交换所有不同部分的变量(请参阅 表 30.1 “简单语言的变量”),简单的语言还提供特殊变量用于格式化日期、日期:命令:pattern,以及调用 bean 方法 bean :bean Ref。例如,您可以使用 date 和 bean 变量,如下所示:
				
simple("Todays date is ${date:now:yyyyMMdd}")
simple("The order type is ${bean:orderService?method=getOrderType}")
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))
...
.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>
<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 属性允许使用动态标头键。
				
嵌套表达式
简单的表达式可以是嵌套的 expression,例如:
simple("${header.${bean:headerChooser?method=whichHeader}}")
simple("${header.${bean:headerChooser?method=whichHeader}}")访问常量或枚举
您可以使用以下语法访问 bean 的常量或 enum 字段:
type:ClassName.Field
type:ClassName.Field
					例如,请考虑以下 Java enum 类型:
				
package org.apache.camel.processor;
...
public enum Customer {
    GOLD, SILVER, BRONZE
}
package org.apache.camel.processor;
...
public enum Customer {
    GOLD, SILVER, BRONZE
}
					您可以访问 Customer enum 字段,如下所示:
				
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}")
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}")
simple("${body?.address?.street}")
					如果正文是 java.util.Map 类型,您可以使用以下表示法在映射中查找带有键 foo 的值:
				
simple("${body[foo]?.name}")
simple("${body[foo]?.name}")OGNL list 元素访问
					您还可以使用方括号表示法 [k] 来访问列表的元素。例如:
				
simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")
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[last-1]}")
					您可以使用 size 方法查询列表的大小,如下所示:
				
simple("${body.address.lines.size}")
simple("${body.address.lines.size}")OGNL 数组长度访问
					您可以通过 length 方法访问 Java 阵列的长度,如下所示:
				
String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);
simple("There are ${body.length} lines")
String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);
simple("There are ${body.length} lines")