Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SpringWS中向自定义SOAP头添加子元素_Soap_Header_Spring Ws_Saaj - Fatal编程技术网

在SpringWS中向自定义SOAP头添加子元素

在SpringWS中向自定义SOAP头添加子元素,soap,header,spring-ws,saaj,Soap,Header,Spring Ws,Saaj,我正在使用SpringWS调用SOAP Web服务。所讨论的Web服务要求我在SOAP头中传递一些信息,如下所示: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <CustomHeaderElement> <clientID>xyz</clientID>

我正在使用SpringWS调用SOAP Web服务。所讨论的Web服务要求我在SOAP头中传递一些信息,如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      <CustomHeaderElement>
         <clientID>xyz</clientID>
         <wsdlVersion>1.0</wsdlVersion>
         <serviceType>ExampleService_v1</serviceType>
      </CustomHeaderElement>
   </soapenv:Header>
   <soapenv:Body>
   ...
   </soapenv:Body>
</soapenv:Envelope>

问题是headerElement似乎没有透露任何实际添加孩子的方法。我知道我可以添加一个属性,但这不是这个服务调用所需要的。有人知道我如何将必要的子元素添加到自定义标题中吗?

我对这个解决方案不满意,但事实证明,您可以将消息强制转换为SOAPMessage,从而使您能够完全访问所有SAAJ API。在此基础上,您可以在标题中构建所需的任何元素。

我遇到了同样的问题,这里是我的解决方案,但它只适用于简单元素,不适用于复杂元素:

template.marshalSendAndReceive(request, new WebServiceMessageCallback(){
    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{
        SaajSoapMessage soapMessage = (SaajSoapMessage) message;
        SoapHeaderElement messageId =  soapMessage.getSoapHeader().addHeaderElement(new QName("http://www.w3.org/2005/08/addressing", "MessageID", "wsa"));
        messageId.setText("urn:abcdef1234");
    }
});
它生成以下XML:

<SOAP-ENV:Header>
  <wsa:MessageID>urn:abcdef1234</wsa:MessageID>
</SOAP-ENV:Header>

urn:abcdef1234
顺便说一句,javax.xml.soap.SOAPMessage也可以工作,请参见此处:

它产生了产出

<SOAP-ENV:Header>
        <mes:requestContext xmlns:mes="UPRS/Services/IProviderDataManagement/Messages">
            <dat:commandId xmlns:dat="UPRS/Services/IProviderDataManagement/Datatypes">ba7b1e13-8a06-49b6-a264-fc0298f55f4f</dat:commandId>
        </mes:requestContext>
    </SOAP-ENV:Header>

BA7B113-8a06-49b6-a264-fc0298f55f4f

我遇到了同样的问题,并用以下代码片段解决了它:

Result result = ((SoapMessage) message).getSoapHeader().getResult();
webServiceTemplate.getMarshaller().marshal(createCustomHeader(), result);

createCustomerHeader()
方法创建了一个从XSD生成的JAXB bean。

您的意思是否与本文类似:将消息转换为SOAPMessage后使用转换器?我同意这既不令人愉快也不优雅。我不知道为什么。-我不是一个真正的答案。另外,@chris提供的链接有很好的解决方案。你的答案,即使被标记为正确的答案,也对我们毫无帮助。欢迎访问SO!请说明您的代码的作用以及它如何回答问题。如果您得到一个代码片段作为答案,您可能不知道如何处理它。答案应该为OP提供如何调试和修复问题的指导。指出代码背后的想法,对于理解问题、应用或修改解决方案有很大帮助。
<SOAP-ENV:Header>
        <mes:requestContext xmlns:mes="UPRS/Services/IProviderDataManagement/Messages">
            <dat:commandId xmlns:dat="UPRS/Services/IProviderDataManagement/Datatypes">ba7b1e13-8a06-49b6-a264-fc0298f55f4f</dat:commandId>
        </mes:requestContext>
    </SOAP-ENV:Header>
Result result = ((SoapMessage) message).getSoapHeader().getResult();
webServiceTemplate.getMarshaller().marshal(createCustomHeader(), result);