【发布时间】:2019-01-25 16:11:19
【问题描述】:
我使用 Camel 2.22.1 和 springboot 2.0.4.RELEASE。骆驼组件camel-saxon 使用默认的 Saxon-HE。我有一些调用 Java 方法的 Xquery 文件,所以我想用 Saxon-PE 替换 Saxon-HE。我为 Saxon-PE 申请了一份测试许可证,并尝试了不同的方法,但没有成功。 Saxon-PE jar 文件saxon9pe.jar 已经加载,但是,它仍然作为 Saxon HE 版本运行。我想,Saxon-PE 没有正确加载许可证。
我尝试了以下方法,它们都没有奏效。
- 将许可文件
saxon-license.lic和saxon9pe.jar放在同一个文件夹中 - 定义环境变量SAXON_HOME,将
saxon-license.lic和saxonpe.jar放入SAXON_HOME\bin中 - 修改
org.apache.camel.component.xquery.XQueryBuilder.configuration在类XqueryBuild.java在包org.apache.camel.component.xquery设置LICENSE_FILE_LOCATION(我得到错误:未知的配置属性http://saxon.sf.net/feature/licenseFileLocation)
Saxon 文档中提到要创建一个 XML 配置文件,但我不知道我应该把这个 XML 配置文件放在哪里。
使用 Java 调用运行 Xquery 时出现错误:
Caused by: net.sf.saxon.trans.XPathException: Cannot find a 0-argument function named Q{java:java.lang.Double}MAX_VALUE(). Reflexive calls to Java methods are not available under Saxon-HE at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionReferences(UnboundFunctionLibrary.java:166) ~[saxon9pe.jar!/:na]
at net.sf.saxon.query.QueryModule.bindUnboundFunctionCalls(QueryModule.java:1172) ~[saxon9pe.jar!/:na]
at net.sf.saxon.expr.instruct.Executable.fixupQueryModules(Executable.java:462) ~[saxon9pe.jar!/:na]
at net.sf.saxon.query.XQueryParser.makeXQueryExpression(XQueryParser.java:176) ~[saxon9pe.jar!/:na]
at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:597) ~[saxon9pe.jar!/:na]
at net.sf.saxon.query.StaticQueryContext.compileQuery(StaticQueryContext.java:658) ~[saxon9pe.jar!/:na]
at org.apache.camel.component.xquery.XQueryBuilder$3.createQueryExpression(XQueryBuilder.java:276) ~[classes!/:2.23.1]
at org.apache.camel.component.xquery.XQueryBuilder.initialize(XQueryBuilder.java:745) ~[classes!/:2.23.1]
at org.apache.camel.component.xquery.XQueryBuilder.evaluateAsDOM(XQueryBuilder.java:190) ~[classes!/:2.23.1]
at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:151) ~[classes!/:2.23.1]
... 40 common frames omitted
可以分享一些使用 Camel 设置 Saxon-PE 以在 Xquery 中调用 Java 的经验吗?
谢谢!
【问题讨论】:
-
知道它是如何失败的会很有用。具体来说,我们需要确定它是找到 Saxon-PE jar 文件并尝试执行它(但失败),还是找不到 Saxon-PE jar 文件。了解症状将有助于区分这两种情况。
-
请注意,该问题与stackoverflow.com/questions/34599874/… 重复,因此某些 SO 成员可能倾向于将其作为重复项关闭;我不愿意这样做,因为自 2016 年以来答案可能已经发生了变化。
-
如果 Xquery 不需要 Saxon PE 中的功能,那么一切都很好。如果在我尝试执行 Xquery 时失败,其中调用了 Java 方法。即使是撒克逊文档中的简单示例
<a xmlns:double="java:java.lang.Double"> {double:MAX_VALUE()} </a> -
使用 Java 调用运行 Xquery 时的错误是:
Caused by: net.sf.saxon.trans.XPathException: Cannot find a 0-argument function named Q{java:java.lang.Double}MAX_VALUE(). Reflexive calls to Java methods are not available under Saxon-HE at net.sf.saxon.query.UnboundFunctionLibrary.bindUnboundFunctionReferences(UnboundFunctionLibrary.java:166) ~[saxon9pe.jar!/:na]我确定saxon9pe.jar已加载并使用,但相信它的行为与 Saxon HE 相同,因为许可证不正确已加载。
标签: apache-camel saxon