2014-09-29 7 views
10

podczas próby zwolnienia mojego pliku XML z mydłem do obiektu JAXB otrzymuję następujący błąd.Jak rozpakować komunikat SOAP XML do obiektu Java

Otrzymujemy błąd, którego oczekiwany element nie ma. Czy należy coś konkretnego zrobić podczas odczytywania 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); 

otrzymuję następujący błąd:

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 

i tu jest XML próbką

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

proszę nie pomagają.

+0

Jaką wartość ma „requestName” mają? – Priyesh

+0

Zobacz [tutaj] (http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html). –

+0

@priyesh: jest to nazwa klasy. Np .: createSessionRequest – srinath

Odpowiedz

17

Nie sądzę, że bierzesz pod uwagę kopertę SOAP ... Twój wygenerowany JAXB Unmarshaller nie będzie wiedział nic na temat znaczników Body lub Envelope, będzie oczekiwał, że twojaStwórzSession będzie elementem głównym, stąd błąd "nieoczekiwanego elementu".

Najpierw należy wyodrębnić zawartość z Koperta, można to zrobić za pomocą metody message.getSOAPBody(). ExtractContentAsDocument(), jeśli najpierw zostanie utworzony obiekt SOAPMessage z treści.

To dość skomplikowanego zrobić, oto przykład pracy z moim 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()); 

Wydaje się, że jeśli nie deklarują swoją nazw w schemacie .XSD plik wtedy zobaczysz błąd .

I stworzył atrapę schematu z elementem korzeń createSession i dodając atrybut targetNamespace regenerujący klas JAXB błąd zniknął

<?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> 
+2

Dzięki za pomoc .. wypróbowałem ten sam kod, zastępując klasę Farm przez klasę CreateSessionRequest. Ale otrzymuję kolejny błąd. javax.xml.bind.UnmarshalException: nieoczekiwany element (uri: "http://example.com/v2", lokalny: "createSession"). Oczekiwane elementy to (none) – srinath

+0

@srinath Czy umieścisz swój plik .xsd, a ja przyjrzę mu się bliżej. – Adam

Powiązane problemy