Java Saxon提供V1 Xpath对象

Java Saxon提供V1 Xpath对象,java,saxon,Java,Saxon,我已经成功地使用萨克森HE9.5.1-5有一段时间了。 我们正在对平台中的一些组件版本进行全面升级,其中包括迁移到Saxon 9.8.0-8 代码在使用该版本时失败。 下面是我们的SpringBeans文件: <bean id="xpathFactory" class="net.sf.saxon.xpath.XPathFactoryImpl" factory-method="newInstance"/> <bean id="xpath" factory-bean

我已经成功地使用萨克森HE9.5.1-5有一段时间了。 我们正在对平台中的一些组件版本进行全面升级,其中包括迁移到Saxon 9.8.0-8 代码在使用该版本时失败。 下面是我们的SpringBeans文件:

    <bean id="xpathFactory" class="net.sf.saxon.xpath.XPathFactoryImpl" factory-method="newInstance"/>
    <bean id="xpath" factory-bean="xpathFactory" factory-method="newXPath"/>
    <bean id="myRequestValidator" class="gov.dhs.ice.prime.query.RequestValidator">
            <constructor-arg index="0" ref="xpath"/>

如您所见,最后一个bean被传递“newXPath”方法的结果。 对于调试,我获取传入对象的名称。 使用9.5.1-5时,传入对象是net.sf.saxon.xpath.xpatheevaluator对象 现在使用9.8.0-8,我将收到一个org.apache.xpath.jaxp.XPathImpl对象

然后,RequestValidator程序作为构造函数的一部分进行一些XPath编译。使用XPathEvaluator对象,一切都很好(一直如此) 现在我得到了一个org.apache.xpath.jaxp.XPathImpl对象,当程序试图编译V2 xpath语句时,构造函数失败。V1工作正常。
那么,为什么这个新版本返回的对象与以前不同呢

我确实尝试过直接构建net.sf.saxon.xpath.xpatheevaluator

    <bean id="xpath" class="net.sf.saxon.xpath.XPathEvaluator"/>
    <bean id="myRequestValidator" class="gov.dhs.ice.prime.query.RequestValidator">
            <constructor-arg index="0" ref="xpath"/>

这在新版本中起了作用。但是,文件似乎推荐了更早的方法

你知道这是怎么回事吗?
感谢Saxon,因为某些版本不再注册为JAXP XPathFactory,请参阅:

JAXP API的设计基础是,当您的应用程序 调用XPathFactory.newInstance(),XPath引擎由 检查系统属性的值并搜索类路径。 如果您依赖此机制,那么您的应用程序最终可能会失败 使用从未测试过的XPath引擎运行。自从 不同的XPath引擎可以在许多重要方面有所不同(大多数 值得注意的是,他们支持的XPath版本),这很容易导致 应用程序失败。因此撒克逊人不再认同自己 (在JAR文件清单中)作为JAXP XPath供应商。如果你想 加载Saxon作为您的XPath引擎,您需要显式地选择它; 仅仅把它放在类路径上是不够的

而您认为在
net.sf.saxon.xpath.XPathFactoryImpl
上调用的
newInstance
方法实际上是抽象基类的方法,它调用基类的另一个重载,该重载应该加载JAXP注册的XPathFactory

因此,您应该做的是:“如果您想使用Saxon作为XPath实现,必须直接实例化类net.sf.Saxon.XPath.XPathFactoryImpl。”,例如,在Java代码
new net.sf.Saxon.XPath.XPathFactoryImpl()


我不确定这是如何用bean语法声明的方式表达的,但也许你知道,或者其他人可以帮助你做到这一点。

是的,只需删除newInstance并进行简单的构造,就可以了。谢谢