2013-04-30 17 views
5

quando i unrmarshall sotto il messaggio SOAP, ottengo eccezione. Qualcuno può dirmi cosa c'è che non va?Unmarshall SOAP Message using JAXB

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:hios="http://schemas.datacontract.org/2004/07/HIOSCommonObjects"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:ValidIssuersProducts> 
     <!--Optional:--> 
     <tem:li> 
      <!--Zero or more repetitions:--> 
      <hios:IssuerProductRequest> 
       <!--Optional:--> 
       <hios:Issuer>33104</hios:Issuer> 
       <!--Optional:--> 
       <hios:Product>33104VA001</hios:Product> 
      </hios:IssuerProductRequest> 
     </tem:li> 
     </tem:ValidIssuersProducts> 
    </soapenv:Body> 
</soapenv:Envelope> 

codice di deserializzazione è come sotto, Clazz è "nome completo di ValidIssuersProducts" richiesta.

public static <T> Object unmarshall(String xml, String clazz) throws ClassNotFoundException, JAXBException { 
     JAXBContext context = JAXBContext.newInstance(Class.forName(clazz)); 
     ByteArrayInputStream input = new ByteArrayInputStream (xml.getBytes());  
     Unmarshaller unmarshaller = context.createUnmarshaller(); 
     //JAXBElement<ValidIssuersProducts> obj = (JAXBElement<ValidIssuersProducts>) unmarshaller.unmarshal(new StreamSource(input), ValidIssuersProducts.class); 

     ValidIssuersProducts value = (ValidIssuersProducts)unmarshaller.unmarshal(input); 
     return value; 

    } 

sto ottenendo qui di seguito eccezione:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are <{http://tempuri.org/}ArrayOfIssuerProductRequest>,<{http://tempuri.org/}ArrayOfIssuerProductResponse>,<{http://tempuri.org/}IssuerProductRequest>,<{http://tempuri.org/}IssuerProductResponse>,<{http://tempuri.org/}ValidIssuersProducts>,<{http://tempuri.org/}ValidIssuersProductsResponse> 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148) 
    at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:239) 
    at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:122) 

risposta

5

È necessario unmarshalling dall'elemento nidificato ValidIssuersProducts che corrisponde al contenuto mappato al posto del SOAP Envelope elemento. È possibile utilizzare un codice Stace XMLStreamReader per analizzare l'XML e passare all'elemento corretto e quindi unmarshal da `XMLStreamReader in quel punto.

Per ulteriori informazioni

Problemi correlati