2014-09-29 17 views
10

trong khi cố gắng unmarshall xà phòng XML của tôi để JAXB đối tượng đang nhận được lỗi sau.Làm thế nào để unmarshall SOAP XML đối tượng Java

Chúng tôi đang nhận được lỗi mà yếu tố mong đợi là không có. Bất cứ điều gì cụ thể được thực hiện trong khi unmarshalling 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); 

Am nhận được lỗi sau:

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 

và đây là mẫu 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> 

hãy làm giúp đỡ.

+0

giá trị gì 'requestName' có? – Priyesh

+0

Xem [tại đây] (http://blog.bdoughan.com/2012/08/handle-middle-of-xml-document-with-jaxb.html). –

+0

@priyesh: tên lớp của nó. Ví dụ: createSessionRequest – srinath

Trả lời

17

Tôi không nghĩ rằng bạn đang lấy phong bì SOAP vào tài khoản ... JAXB Unmarshaller được tạo của bạn sẽ không biết bất kỳ điều gì về thẻ Body hoặc Envelope, nó sẽ được mong đợi của bạn để tạo thành phần tử gốc do đó Lỗi "phần tử không mong muốn".

Bạn cần trích xuất nội dung từ phong bì trước, bạn có thể thực hiện việc này với message.getSOAPBody(). ExtractContentAsDocument() nếu bạn tạo đối tượng SOAPMessage từ nội dung của bạn trước tiên.

Đó là khá khó sử dụng để làm, đây là một ví dụ làm việc kể từ tôi 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()); 

Dường như nếu bạn không khai báo không gian tên của bạn trong lược đồ XSD tập tin sau đó bạn sẽ thấy lỗi mà bạn có .

Tôi tạo ra một sơ đồ giả với một createSession tử gốc và bằng cách thêm thuộc tính targetNamespace và tái sinh các lớp JAXB lỗi biến mất

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

Cảm ơn sự giúp đỡ của bạn .. tôi đã thử cùng một mã bằng cách thay thế lớp Farm bằng lớp CreateSessionRequest. Nhưng tôi lại nhận được lỗi sau. javax.xml.bind.UnmarshalException: yếu tố không mong muốn (uri: "http://example.com/v2", local: "createSession"). Các yếu tố mong đợi là (không) – srinath

+0

@srinath Bạn có thể đăng tệp .xsd của mình và tôi sẽ xem xét kỹ hơn. – Adam

Các vấn đề liên quan