2016-09-16 105 views
0

我正在使用具有soap消息頭的web服務,如下所示。使用jaxb獲取soap消息頭Unmarshaller

<SOAP-ENV:Header> 
     <MessageHeader xmlns:cnr="http://testservice.com/Namespaces/Types/Public/DataModel.xsd" xmlns="http://testservice.com/Namespaces/Types/Public/MessageHeader.xsd"> 
     <CommonMessageHeader> 
      <cnr:version>v109</cnr:version> 
      <cnr:dateTimeStamp>2016-08-31T14:37:03Z</cnr:dateTimeStamp> 
      <cnr:referenceId>cc7b-429c-a2f5-1f61dcb94e85</cnr:referenceId> 
     </CommonMessageHeader> 
     <SecurityMessageHeader> 
      <cnr:userName>dtv_directvcom</cnr:userName> 
      <cnr:userPassword>dtv_directvcom0624</cnr:userPassword> 
     </SecurityMessageHeader>   
     </MessageHeader> 
    </SOAP-ENV:Header> 

我試圖得到迴應,但面對下面error.I我得到正確的響應(用了SoapUI相比)之後,這種肥皂頭到Java對象轉換。

unexpected element (uri:"http://testservice.com/Namespaces/Profile/Types/Public/MessageHeader.xsd", local:"MessageHeader"). 
Expected elements are <{http://testservice.com/Namespaces/Types/Public/SoapFaultDetails.xsd}ApplicationException>, 
<{http://testservice.com/Namespaces/Container/Public/ServiceRequest.xsd}ServiceRequest>, 
<{http://testservice.com/Namespaces/Container/Public/ServiceResponse.xsd}ServiceResponse>, 
<{http://testservice.com/Namespaces/Types/Public/MessageHeader.xsd}MessageHeader> 

下面是使用的代碼片段。

NodeList nodeList = soapMessage.getSOAPHeader().getElementsByTagName("MessageHeader"); 
if ((nodeList != null) && (nodeList.getLength() > 0)) { 
     Node header = nodeList.item(0); 
     JAXBElement jaxbElement = null; 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     jaxbElement = (JAXBElement) unmarshaller.unmarshal(header); 
     if (jaxbElement != null) { 
      Object value = jaxbElement.getValue(); 
      if ((value != null) && (value instanceof JavaObject)) { 
        setResponseHeader((JavaObject) value); 
       } 
      } 
     } 

我不知道另一個服務的MessageHeader是如何作爲名稱空間URI來的。任何人都可以幫助我嗎?

+0

我已經在消息頭中傳遞了另一個服務的應用程序名稱。這是問題。通過傳遞正確的價值來解決它。謝謝大家的幫助。 – Vijay

回答

0

像這樣的事情也許可以幫助你:

JAXBContext jaxbContext = JAXBContext.newInstance(YourClass.class); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 

JAXBElement<YourClass> root = jaxbUnmarshaller.unmarshal(new StreamSource(
     header), YourClass.class); 
YourClass response = root.getValue(); 

你可以閱讀完整的文檔here。你也可以在哪裏找到你的錯誤。這非常有用。