代码之家  ›  专栏  ›  技术社区  ›  Mike Deck

将子元素添加到Spring WS中的自定义SOAP头中

  •  15
  • Mike Deck  · 技术社区  · 15 年前

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

    WebServiceTemplate template = ...;
    
    template.marshalSendAndReceive(request, new WebServiceMessageCallback(){
        public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{
            SoapMessage soapMessage = (SoapMessage)message;
            SoapHeader soapHeader = soapMessage.getSoapHeader();
            QName qName = new QName("CustomHeaderElement");
            SOAPHeaderElement headerElement = soapHeader.addHeaderElement(qName);
            //would like to do something like headerElement.addChild(clientIdNode);
        }
    });
    

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

    4 回复  |  直到 10 年前
        1
  •  8
  •   user3377322    8 年前

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

    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>
    

    顺便说一句 javax.xml.soap.SOAPMessage http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html#bnbia

        2
  •  3
  •   Manjago    11 年前
    final String datPrefix = "dat";
    final String datNamespaceUri = "UPRS/Services/IProviderDataManagement/Datatypes";
    
    final String mesPrefix = "mes";
    final String mesNamespaceUri = "UPRS/Services/IProviderDataManagement/Messages";
    
    SoapEnvelope se = s.getEnvelope();
    se.addNamespaceDeclaration(mesPrefix,
            mesNamespaceUri);
    se.addNamespaceDeclaration(datPrefix,
            datNamespaceUri);
    
    SoapMessage s = (SoapMessage) message;
    
    Element root = new Element("requestContext", mesPrefix, mesNamespaceUri);
    Element child = new Element("commandId", datPrefix, datNamespaceUri).addContent(guid);
    root.addContent(child);
    
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new JDOMSource(root), s.getSoapHeader().getResult());
    

    它产生了产量

    <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>
    
        3
  •  1
  •   Mike Deck    15 年前

        4
  •  0
  •   Ondrej Burkert    9 年前

    我有同样的问题,并用下面的代码片段解决了它:

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

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

    推荐文章