2016-04-14 62 views
1

我正在使用REST和XML進行客戶端和服務器之間的通信。客戶端爲每個xml添加封裝簽名,服務器需要驗證其身份驗證。我正在使用JAXB進行編組和解組。 我需要將簽名元素作爲org.w3c.dom.Element來驗證,並且我想避免使用直接DOM操作。 服務器還需要簽署響應XML。使用JAXB獲取XML簽名的最佳方式

讓我們看看一些代碼:

REST接口

的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。

回答

0

我不確定我是否正確理解了你,但是如果你需要提取簽名,你可以使用stax。我在春季批量工作中這樣做。

我有以下豆類:

@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更好。

相關問題