使用jaxb Unmarshaller获取soap消息头

时间:2016-09-16 10:07:09

标签: java web-services soap jaxb soapheader

我正在使用具有soap消息头的Web服务,如下所示。

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

我试图在获得响应之后将这个soap标头转换为java对象,但面临错误。我正在得到正确的响应(与SoapUI相比)。

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来的。有人可以帮我吗?

1 个答案:

答案 0 :(得分: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。你也可以在哪里找到你的错误。这非常有用。