Unmarshall SOAP message using JAXB

when I unrmarshall below the SOAP message, I get an exception. Can someone tell me what is wrong?

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

The Unmarshalling code is as follows: clazz is the "full name of the ValidIssuersProducts request."

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;

    }

I get below exceptions:

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)
+5
source share
1 answer

You need to undo the marker from the nested element ValidIssuersProductsthat matches your displayed content, not the SOAP element Envelope. You can use StAX XMLStreamReaderto parse the XML and go to the correct element, and then undo it from the XMLStreamReader at that point.

Additional Information

+5
source

All Articles