2016-04-14 13 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要素の製品がクラスインスタンスにマップされています。

BTW sax/staxは標準のUnmarshallerよりも優れているようです。

関連する問題