我有一个非常简单的 Camel 路线,除了使用的 xquery,这就是为什么我将其提取到一个单独的文件中。在我的 Camel route ,我使用 Transformer EIP 调用 xquery:
.transform().xquery("resource:classpath:xquery/myCoolXQuery.xquery",String.class)
XQuery 本身工作正常,但由于一些功能更改,我现在想导入另一个 XQuery 模块,我想将其用作具有一些帮助功能的“库”,因为我有很多可以使用它们的 XQuery 文件.
所以我在 XQuery 中所做的是:
xquery version "3.0" encoding "UTF-8";
declare namespace fn = 'http://www.w3.org/2005/xpath-functions';
(: Library of really helpful functions :)
import module namespace lib = "http://handofnod.com/xquery-lib" at "classpath:xquery/lib.xquery";
问题:
如何配置 Apache Camel StandardModuleURIResolver
是否能够从类路径加载导入的模块?
到目前为止的调查/问题
不幸的是 apache Camel 现在抛出 NullpointerException
在 StandardModuleURIResolver
在:
if ("classpath".equals(absoluteURI.getScheme())) {
String path = absoluteURI.getPath();
is = this.config.getDynamicLoader().getResourceAsStream(path);
那是因为 absoluteURI
(即 "classpath:xquery/lib.xquery"
)无法正确转换,并且变量 path
是 NULL
(这几乎是代码味道,但现在不关我的事)。
absoluteURI
无法转换,因为 net.sf.saxon.query.XQueryParser
this.env.getStaticBaseURI()
中没有设置任何值.
所以我在调试过程中尝试设置 staticBaseURI
值为 classpath
但随后StandardModuleURIResolver
还返回 absoluteURI
其中有 NULL
getPath()
中的值从而导致相同的 NullPointerException
。
所以现在我不知道如何将 Transformer-EIP 与 XQuery 一起使用,该 XQuery 使用模块导入来实现某些辅助函数。
另一种可能的解决方案
另一个可能的解决方案是不使用 Apache Camel 中实现的 Transformer-EIP,而是使用 ToDefinition
因为可以通过 URL 参数定义自定义 Saxon 配置,该参数可以使用覆盖的 ModuleURIResolver
那么就没有问题了。
另外,我当然可以使用自定义 Processor
实现来实现我想要的,但这不是使用 Camel 的重点,它为 EIP 提供了实现。
如果我可以在 XQuery 中使用带有模块导入的 Transformer-EIP,那就太好了。
项目设置是:
- Spring-Boot 2.1.0.RELEASE
- Apache Camel 2.22.2
- 使用 Maven 构建
最后一个问题
有人可以帮我吗?
编辑1:
我从 Camel 和 Saxon 下载了源代码,以便能够进行调试并更好地了解发生的情况,并尝试了一些方法:
首先我尝试使用绝对路径:
.transform().xquery("resource:classpath:/xquery/myCoolXQuery.xquery",String.class)
这样我就得不到 NullPointerException
不再因为在 StandardModuleURIResolver
在getQuerySource
路径不是 NULL
不再:
不幸的是,该文件无法加载
config.getDynamicLoader().getResourceAsStream(path);
并返回NULL
.
所以我想我将 xquery 文件从 src\main\resoures
正下方的目录中移动但这也没有帮助,我得到了相同的结果。
最佳答案
因为我的问题似乎没有答案,所以我进一步调试,似乎不可能以任何方式使用 XQuery 配置 Transformer-EIP。另外,我无法找到任何方法从类路径加载导入的 xquery 模块,因此我更改了代码,现在我通过 XQueryEndpoint 调用我的 xquery,它提供了对自定义配置的支持:
.to("xquery:/xquery/myCoolXQuery.xquery?configuration=#saxonConfig&resultsFormat=String")
这样我的路线就可以工作了。但如果能够使用 transform()
就太好了,因为代码会更容易理解。
关于java - 使用 apache Camel Transformer EIP 将模块导入 xquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462217/