我有一个用于签署XML文档的Java应用程序。将Java升级到最新版本(Java7u25)后,它将停止工作。我收到以下错误:
javax.xml.crypto.dsig.XMLSignatureException:
javax.xml.crypto.URIReferenceException:
com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException:
Cannot resolve element with ID ...
恢复为java7u21解决了该问题。 XML Dig Sig API中是否有任何导致此错误的更改?
最佳答案
这里同样的问题。由于不断发展,似乎是JVM内部的错误。
我已经将其追溯到com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment
在Java 7u21及之前的版本中:
91: // Element selectedElem = doc.getElementById(id);
92: selectedElem = IdResolver.getElementById(doc, id);
在Java 7u25中:
87: selectedElem = doc.getElementById(id);
//...
93: if (secureValidation) {
secureValidation
指的是XML Sig验证上的Java 7u25演化(请参阅changelog),因此在进行这种演化时,他们必须将 splinter 的更改为。我们通过为
javax.xml.crypto.URIDereferencer
提供自定义javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)
来解决此问题,该自定义document.getElementById(...)
能够解析尚未在DOM文档树(XMLObject中的片段)中的节点。我现在正在将此报告给Oracle,我将用错误ID更新答案。
编辑:在apache SVN中找到了此
编辑2:感谢this bug report,我了解这是XML“Id”属性处理的一个发展。
以前的Java/JSR-105/SANTUARIO以前版本对
Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
中使用的“Id”属性非常宽容,但是此新版本需要一个标识为的属性,该属性标识为 XML。我的意思是,仅命名属性“Id”或“ID”已经不够,您最终需要通过XSD/DTD模式验证将其标记为ID,即。 不幸的是,我遵循的模式无效,因此不能被Java解析。
如果您的情况相同,请在下面查看我的解决方案。否则,如果您的XML文档确实具有有效的架构,请查看@sherb解决方案https://stackoverflow.com/a/17437919/233906
解
幸运的是,您可以使用
descendant-or-self::*/@Id
之类的方法将属性标记为ID。与
Attr
之类的XPath一起获取((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)
“Id”节点,再加上Java setIdAttributeXXX()
,这会让您摆脱麻烦。但要小心:
clone
仅对当前文档和节点有效。如果您使用adopt
/import
/setIdAttributeXXX()
,则需要在每个DOM树的新节点上执行ojit_code关于java - 升级到java7u25后出现XML dig sig错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17331187/