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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇