【发布时间】:2014-12-10 18:07:35
【问题描述】:
我正在尝试使用“选择”来根据部分内容来引导 XML 文档。但由于我是 mule 新手,我正在努力理解如何让 xpath 表达式解析传入的消息。
作为SSCCE,我设置了这个流程:
每个选项的“何时”设置为
#[xpath('//foo/bar').text] == baz
和
#[xpath('//foo/bar').text] != baz`
分别。
不管我怎么尝试;它总是给客户端一个响应:
Execution of the expression "xpath('//foo/bar').text] == baz" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: ContentLengthInputStream
我需要先将输入转换成某种东西吗?如果是,那又如何?或者我还应该做些什么来完成这项工作?
编辑
检查日志后,错误似乎与this 相同。多个 JAXB 上下文实例。我找到了两种方法来解决这个问题。
一种是重构我们所有的代码,使其只有一个 JAXB 实例(这并不容易也不可取,但它确实解决了问题)。
另一个是停止在 EML 中使用 XPATH。相反,我创建了一个 Java 转换器,它手动使用 Java Document Builder 和 XPATH 对象来提取信息并将其放入注册表中。这也奏效了。
请注意,如果不点击“多个 JAXB 上下文”,我们将无法使用 getPayloadAsString()。不要问我为什么 mule 需要 JAXB 上下文来将输入流转换为字符串。因此,我们在流程中放置了一个Bytearray to String 转换器:
当包含多个 JAXB 上下文时,如果有人有任何在 eml 中使用 xpath 的好方法,请随时留下答案
【问题讨论】: