2013-04-30 9 views
5

Wenn ich unter SOAP-Nachricht unrmarshall, bekomme ich eine Ausnahme. Kann mir jemand sagen, was falsch ist?Unmarshall SOAP-Nachricht mit 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> 

Unmarshalling Code ist wie unten, clazz ist "vollständig qualifizierte Name ValidIssuersProducts" -Anfrage.

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; 

    } 

ich unten Ausnahme bin immer:

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) 

Antwort

5

Sie müssen aus dem verschachtelten Elemente entpacken ValidIssuersProducts der anstelle des SOAP Envelope Element zum zugeordneten Inhalt entspricht. Sie können ein StAX XMLStreamReader verwenden, um das XML zu parsen und zum korrekten Element zu gelangen, und dann an diesem Punkt vom XMLStreamReader abmaren.

Weitere Informationen