第 22 章 JXPath
概述
通过 JXPath 语言,您可以使用 Apache Commons JXPath 语言调用 Java Bean。JXPath 语言的语法与 XPath 类似,但并不是从 XML 文档中的选择元素或属性节点,而是调用 Java Bean 对象图形上的方法。如果一个 bean 属性返回一个 XML 文档(一个 DOM/JDOM 实例),但是,路径的其余部分将解释为 XPath 表达式,用于从文档中提取 XML 节点。换句话说,JXPath 语言提供了一个混合的对象图形导航和 XML 节点选择。
添加 JXPath 软件包
要在路由中使用 JXPath,您需要在项目中添加对 camel-jxpath
的依赖,如 例 22.1 “添加 camel-jxpath 依赖项” 所示。
例 22.1. 添加 camel-jxpath 依赖项
<!-- Maven POM File --> <properties> <camel-version>2.23.2.fuse-7_10_0-00018-redhat-00001</camel-version> ... </properties> <dependencies> ... <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jxpath</artifactId> <version>${camel-version}</version> </dependency> ... </dependencies>
变量
表 22.1 “JXPath 变量” 列出在使用 JXPath 时可访问的变量。
变量 | 类型 | 值 |
---|---|---|
|
| 当前交换 |
|
| IN 消息 |
|
| OUT 消息 |
选项
表 22.2 “JXPath 选项” 描述 JXPath 选项。
选项 | 类型 | 描述 |
---|---|---|
|
| Camel 2.11/2.10.5:允许在 JXPathContext 上打开lenient。使用此选项时,可以通过 JXPath 表达式来评估可能无效或缺失数据的表达式和消息正文。请参阅 JXPath 文档。此选项默认为 false。 |
例子
以下示例路由使用 JXPath:
<camelContext> <route> <from uri="activemq:MyQueue"/> <filter> <jxpath>in/body/name = 'James'</xpath> <to uri="mqseries:SomeOtherQueue"/> </filter> </route> </camelContext>
以下简单示例使用 JXPath 表达式在 Message Filter 中作为 predicate:
from("direct:start"). filter().jxpath("in/body/name='James'"). to("mock:result");
JXPath 注入
您可以使用 Bean 集成在 bean 上调用方法,并使用各种语言(如 JXPath)从消息中提取值并将其绑定到方法参数。
例如:
public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(@JXPath("in/body/foo") String correlationID, @Body String body) { // process the inbound message here } }
从外部资源载入脚本
可从 Camel 2.11 开始
您可以对脚本外部化,并让 Camel 从 "classpath:"
、"file:"
或 "http:"
等资源加载它。请遵循以下语法:
"resource:scheme:location"
例如,要引用类路径中的文件:
.setHeader("myHeader").jxpath("resource:classpath:myjxpath.txt")