如何使用Java XML中的引用URI加载外部资源

spi*_*eap 10 java xml reference digital-signature

我试图从URI引用中提取XML节点.此URI引用由XAdES4j签名者生成,并且可以引用同一XML文件或同一文件夹中的节点.

我希望加载引用会很简单

XMLSignatureInput referencedXML = ResourceResolver.resolveStatic(referenceNode.getAttributeNode("URI"), referenceDoc.getBaseURI());
Run Code Online (Sandbox Code Playgroud)

然而,这只是给我一个NullPointerException没有有用的消息.两个参数都是非null,在一个简单的例子中,URI属性是"data.xml",referenceDoc基URI是"/Users/ryan/.../test-files/signature.xml.data.xml驻留在相同的test-files目录.

URI可以指向文件中的元素,所以我希望有一个参考加载器可以为我处理这种复杂性.我错过了什么?!

编辑:

我试图加载的引用是:

<ds:Reference Id="xmldsig-c6050e36-d9e7-46d9-ac5f-447d1bbb405f-ref0" URI="lote.xml" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
Run Code Online (Sandbox Code Playgroud)

use*_*257 2

完全在黑暗中刺探(你真的需要粘贴堆栈跟踪......),但这里是。

我快速浏览了 ResourceResolver 的源代码: http://java2s.com/Open-Source/Java-Document/XML/xml-security-1.4.3/org/apache/xml/security/utils/resolver/资源解析器.java.htm

我可以看到,由于 ResourceResolver 中未初始化 _resolverVector 字段,将会出现 NullPointerException,除非已经在 ResourceResolver 上调用了静态 init() 方法。在init()方法上方,有一条注释:

The init() function is called by org.apache.xml.security.Init.init()
Run Code Online (Sandbox Code Playgroud)

ResourceResolver 本身似乎不会触发该调用 - 您会触发该调用吗?如果没有,您应该在使用任何 org.apache.xml.security 内容之前尝试一下。