如何让Java XML签名库适配XML DSIG XSD生成的DTO类?
解决方案
一、将XMLSignature转换为XSD生成的Java类实例
javax.xml.crypto.dsig生成的XMLSignature没有直接转换接口,最可靠的方式是通过XML序列化+JAXB反序列化实现转换:
- 提取
XMLSignature生成的签名DOM节点 - 用JAXB将节点解析为XSD生成的对应类(比如截图中的
SignatureType)
示例代码:
// 假设已完成签名操作,得到XMLSignature实例signature和对应的Document对象doc DOMSignContext signContext = new DOMSignContext(yourPrivateKey, doc.getDocumentElement()); signature.sign(signContext); // 获取签名对应的DOM节点 Node signatureNode = signature.getParent(); // 初始化JAXB上下文,绑定XSD生成的目标类 JAXBContext jaxbContext = JAXBContext.newInstance(SignatureType.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 解析节点为XSD生成的类实例 SignatureType signatureDto = (SignatureType) unmarshaller.unmarshal(signatureNode);
注意:必须保证XSD生成的类的命名空间与XML签名标准命名空间(http://www.w3.org/2000/09/xmldsig#)完全一致,否则JAXB解析会失败。
二、能否让签名库直接使用XSD生成的Java类?不行
javax.xml.crypto.dsig的API是基于DOM设计的XML签名处理框架,核心接口XMLSignature及相关组件围绕XML节点操作实现,没有提供直接对接JAXB生成类的能力,因此无法让它直接使用XSD生成的Java文件,只能通过上述转换方式衔接两者。
内容的提问来源于stack exchange,提问作者czetsuya
相关产品推荐
相关产品推荐

