web-dev-qa-db-fra.com

Comment dé-marshall SOAP XML to Java Object

en essayant de démasquer mon savon XML vers l'objet JAXB, j'obtiens l'erreur suivante.

Nous obtenons une erreur indiquant que l'élément attendu est nul. Si quelque chose de spécifique devait être fait en démêlant le XML SOAP.

javax.xml.bind.JAXBContext jaxbContext = (javax.xml.bind.JAXBContext) JAXBContext.newInstance(Class.forName(requestName));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(SoapXmlString);          
reqInfo = unmarshaller.unmarshal(reader);

Je reçois l'erreur suivante:

 javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are (none)
    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

et voici l'exemple XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://example.com/v2">
       <soapenv:Header/>
       <soapenv:Body>
          <v2:createSession>
             <v2:client>
                <!--Optional:-->
                <v2:name>?</v2:name>
                <!--Optional:-->
                <v2:clientId>?</v2:clientId>
                <!--Optional:-->
                <v2:requestId>?</v2:requestId>
             </v2:client>
             <!--Optional:-->
             <v2:oldSessionId>?</v2:oldSessionId>
             <!--Optional:-->
             <v2:clientIp>?</v2:clientIp>
             <!--Optional:-->
             <v2:clientIpStatus>?</v2:clientIpStatus>
             <!--Optional:-->
             <v2:superBYOBFlow>?</v2:superBYOBFlow>
             <!--Optional:-->
             <v2:FlowParams>?</v2:FlowParams>
             <!--Optional:-->
             <v2:deviceInfo>?</v2:deviceInfo>
          </v2:createSession>
       </soapenv:Body>
    </soapenv:Envelope>

Veuillez aider.

12
srinath

Je ne pense pas que vous tenez compte de l'enveloppe SOAP ... Votre JAXB Unmarshaller généré ne saura rien des balises Body ou Envelope, il s'attendra à ce que votre createSession soit l'élément racine d'où l'erreur "élément inattendu".

Vous devez d'abord extraire le contenu de l'enveloppe, vous pouvez le faire avec message.getSOAPBody (). ExtractContentAsDocument () si vous créez d'abord un objet SOAPMessage à partir de votre contenu.

C'est assez compliqué à faire, voici un exemple de travail de mon blog

String example =
        "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header /><soapenv:Body><ns2:farm xmlns:ns2=\"http://adamish.com/example/farm\"><horse height=\"123\" name=\"glue factory\"/></ns2:farm></soapenv:Body></soapenv:Envelope>";
SOAPMessage message = MessageFactory.newInstance().createMessage(null,
        new ByteArrayInputStream(example.getBytes()));
Unmarshaller unmarshaller = JAXBContext.newInstance(Farm.class).createUnmarshaller();
Farm farm = (Farm)unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());

Il semble que si vous ne déclarez pas votre espace de noms dans votre fichier de schéma .xsd, vous verrez l'erreur que vous avez.

J'ai créé un schéma factice avec un élément racine createSession et en ajoutant l'attribut targetNamespace et en régénérant les classes JAXB, l'erreur a disparu

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://example.com/v2"> <!-- targetNamespace essential for JAXB to work-->
    <xs:element name="createSession">  
        <xs:complexType>
            <xs:attribute name="foo" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>
23
Adam