java - 使用 apache Camel Transformer EIP 将模块导入 xquery

标签 java apache-camel

我有一个非常简单的 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 现在抛出 NullpointerExceptionStandardModuleURIResolver在:

if ("classpath".equals(absoluteURI.getScheme())) {
    String path = absoluteURI.getPath();
    is = this.config.getDynamicLoader().getResourceAsStream(path);

那是因为 absoluteURI (即 "classpath:xquery/lib.xquery" )无法正确转换,并且变量 pathNULL (这几乎是代码味道,但现在不关我的事)。

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不再因为在 StandardModuleURIResolvergetQuerySource路径不是 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/

相关文章:

java - 从另一个 Activity 的 Activity 中的 fragment 传递数据

java - 家庭作业帮助 Pt2(数学复杂课)

java - 如何使用Camel解压加密的zip文件

java - Apache Camel 同步多个消费者

java - 如何创建我自己的 PageSize 变量以使用 iTextpdf 创建 PDF 文档

java - 关于 .jar 文件的一点困惑

java - 在菜单应用程序打开应用程序之前运行应用程序页面时出错

java - Apache Camel 转义双花括号

java - Apache Camel - 流关闭

web-services - Camel 和 BPEL 的区别