java - 使用 JAXB 获取 XML 签名的最佳方法

标签 java xml jaxb signature

我使用 REST 和 XML 进行客户端和服务器之间的通信。客户端向每个 xml 添加封装签名,服务器需要验证其身份验证。我使用 JAXB 进行编码和解码。 我需要获取 org.w3c.dom.Element 形式的签名元素来验证它,并且我想避免使用直接 DOM 操作。 服务器还需要对响应 XML 进行签名。

让我们看一些代码:

REST接口(interface)

getXML(根根)

XML:

<root>
  <foo></foo>
  <bar></bar>
  <Signature Id="Signature-1c7757b0" xlns="http://www.w3.org/2000/09/xmldsig#">
      ...
  </Signature> 
<root>

这是我当前的解决方案。

JAXB 类

@XmlRootElement
public class Root{

   @XmlElement
   private Foo foo;

   @XmlElement
   private Bar bar;

   @XmlAnyElement(lax = true)
   private List<Element> signature;

}

有人能想出更好的解决方案来处理这个问题吗?我在网上没有找到很多专门详细说明如何使用 DSig 库和 JAXB 的帮助。

最佳答案

我不确定我是否理解正确,但如果您需要提取签名,可以使用 stax。我对 Spring 批量作业这样做。

我有以下 bean :

@Bean
public StaxEventItemReader<Catalog.Products.Product> nexwayCatalogReader() {
    return Try.ofFailable(() -> {
        final StaxEventItemReader<Catalog.Products.Product> itemReader = new StaxEventItemReader<>();
        itemReader.setResource(new UrlResource(nexwaySettings.getEndpoints().getXmlCatalogUrl()));
        itemReader.setFragmentRootElementName("product");
        itemReader.setUnmarshaller(productMarshaller());
        return itemReader;
    }).orElseThrow(() -> new RuntimeException("Unable to create resource using nexwayCatalogUrl = ["
                            + nexwaySettings.getEndpoints().getXmlCatalogUrl() + "]"));
}

@Bean
public Jaxb2Marshaller productMarshaller() {
    final Jaxb2Marshaller productMarshaller = new Jaxb2Marshaller();
    productMarshaller.setMappedClass(Catalog.Products.Product.class);
    productMarshaller.setClassesToBeBound(Catalog.Products.Product.class);
    return productMarshaller;
}

因此读者只读取我需要的 xml 部分(产品)。 Xml 元素产品正在映射到类实例。

顺便说一句,sax/stax 似乎比标准 Unmarshaller 更好。

关于java - 使用 JAXB 获取 XML 签名的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626295/

相关文章:

java - 如何将数据库 XML 输出映射到 JAXB 派生对象模型

java - 如何连接到共享邮箱?

java - 两种索引到数组中间的形式在用法上有什么区别吗?

java - RxJava 忽略 onNext

html - xhtml文档中如何使用svg命名空间

Android L 的涟漪效应 - 按钮的触摸反馈 - 使用 XML

jquery - 如何使用 AJAX 仅从前几个 XML 条目获取数据

java - 尽管已配对,BluetoothAdapter.getBondedDevices 返回零个设备,为什么?

java - 如何解析 XML(RowsetSchema) 以在 JAVA 中使用 JAXB 解码

scala - 如何将 Float 取消/编码为 Scala Option[Float] 而不是使用 JAXB 的 Java Float?