javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID ...
我已经把它调到了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是指Java Sig验证的Java 7u25演进(见changelog),所以在进行这一演变的同时,他们必须已经破坏了其他的东西。
我们已经解决了这个问题,提供了一个自定义javax.xml.crypto.URIDereferencer到javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer),它能够解析尚未在DOM文档树中的节点(片段在XMLObject中)。
我现在向Oracle报告这个问题,我会用错误ID更新答案。
编辑:在apache SVN发现
编辑2:感谢this bug report我已经明白,这是XML“Id”属性处理中的演变。
以前版本的java / JSR-105 / SANTUARIO过去对document.getElementById(…)中使用的“Id”属性非常宽容,但是这个新版本需要一个标识为ID XML的属性。我的意思是命名属性“Id”或“ID”不够,您需要将其标记为ID,最终通过XSD / DTD模式验证。
不幸的是,我遵循一个无效的模式,因此不能被Java解析。
如果您处于同一情况,请参阅我的解决方案。否则,如果您的XML文档确实有一个有效的模式,请查看@sherb solution http://stackoverflow.com/a/17437919/233906
解
幸运的是,您可以使用像Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
这样的方法将属性标记为ID。
结合一些XPath,如descendant-or-self :: * / @ Id来获取Attr“Id”节点加上一些Java((Element)attr.getParentNode())。setIdAttributeNode(attr,true)应该让你离开麻烦。
但要小心:setIdAttributeXXX()仅对当前文档&节点。如果克隆/采用/导入,则需要在每个DOM树的新节点上执行setIdAttributeXXX()