JAXB

2016-04-14 36 views
1

kullanarak XML imzası almanın en iyi yolu İstemci ve sunucu arasındaki iletişim için REST ve XML kullanıyorum. İstemci her xml'ye zarflı bir imza ekler ve sunucunun kimlik doğrulamasını doğrulaması gerekir. Marshalling ve unmarshalling için JAXB kullanıyorum. İmge elemanını doğrulamak için org.w3c.dom.Element olarak almalı ve düz DOM manipülasyonunu kullanmaktan kaçınmak istiyorum. Sunucu ayrıca XML yanıtını da imzalamalıdır. Bazı koduJAXB

inceleyelim:

DİNLENME arayüzü

GetXml (Kök kök)

XML:

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

Bu benim şimdiki çözümdür.

@XmlRootElement 
public class Root{ 

    @XmlElement 
    private Foo foo; 

    @XmlElement 
    private Bar bar; 

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

} 

Herkes daha iyi bir çözüm düşünün Can JAXB sınıf bu işlemek için? Özellikle DSig kütüphanesi ve JAXB ile nasıl çalışılacağını detaylandıran bir çok çevrimiçi yardım bulamadım.

cevap

0

Seni doğru anladığımdan emin değilim, ancak İmzayı ayıklamanız gerekiyorsa, stax kullanabilirsiniz. Spring batch işlerinde bunu yapıyorum.

Aşağıdaki fasulye:

@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; 
} 

Yani okuyucu sadece ben (ürünleri) ihtiyaç xml parçası okur. Xml öğesi ürün sınıf örneğine eşleniyor. BTW sax/stax, standart Unmarshaller'dan daha iyi bir fikir gibi görünmektedir.