77.3. OGNL 表达式支持
使用 OGNL 时,需要在 classpath 上具有 camel-bean JAR。
Camel 的 OGNL 支持仅用于调用方法。您无法访问字段。Camel 支持访问 Java 阵列的长度字段。
Simple 和 Bean 语言现在支持 Camel OGNL 表示法,用于以类似方式调用 Bean。假设 Message IN 正文包含 POJO,它具有一个 getAddress () 方法。
然后,您可以使用 Camel OGNL 表示法访问地址对象:
simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")
simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")
Camel 了解 getter 的简写名称,但您可以调用任何方法或使用真实名称,例如:
simple("${body.address}")
simple("${body.getAddress.getStreet}")
simple("${body.address.getZip}")
simple("${body.doSomething}")
simple("${body.address}")
simple("${body.getAddress.getStreet}")
simple("${body.address.getZip}")
simple("${body.doSomething}")
如果正文没有地址,也可以使用 null 安全运算符(?.)以避免 NPE
simple("${body?.address?.street}")
simple("${body?.address?.street}")
也可以在 映射 或 列表 类型中索引,以便您可以执行以下操作:
simple("${body[foo].name}")
simple("${body[foo].name}")
要假定正文基于 map,并使用 foo 作为键查找值,并且对该值调用 getName 方法。
如果键有空格,则必须 使用引号括起键,例如 'foo bar' :
simple("${body['foo bar'].name}")
simple("${body['foo bar'].name}")
您可以使用其密钥名称(带有或不带点)直接访问 映射 或 列出 对象:
simple("${body[foo]}")
simple("${body[this.is.foo]}")
simple("${body[foo]}")
simple("${body[this.is.foo]}")
假设密钥 foo 没有值,您可以使用 null secure operator 来避免 NPE,如下所示:
simple("${body[foo]?.name}")
simple("${body[foo]?.name}")
您还可以访问 List 类型,例如从您可以执行的地址获取行:
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]}")
有一个特殊的 最后一个 关键字,可用于从列表中获取最后一个值。
simple("${body.address.lines[last]}")
simple("${body.address.lines[last]}")
另外,要得到最后的 2 个可以减去一个数字,因此我们可以使用 last-1 表示:
simple("${body.address.lines[last-1]}")
simple("${body.address.lines[last-1]}")
第三部分是课程:
simple("${body.address.lines[last-2]}")
simple("${body.address.lines[last-2]}")
您可以在列表上调用 size 方法
simple("${body.address.lines.size}")
simple("${body.address.lines.size}")
Camel 也支持 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")
而且是,您可以将其与 Operator 支持相结合,如下所示:
simple("${body.address.zip} > 1000")
simple("${body.address.zip} > 1000")