XML dig sig错误升级到java7u25后

前端之家收集整理的这篇文章主要介绍了XML dig sig错误升级到java7u25后前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个用于签署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似乎是一个bug。

我已经把它调到了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()

原文链接:https://www.f2er.com/xml/293357.html

猜你在找的XML相关文章