【问题标题】:Customizing Spring Integration Web Service SOAP Envelope/Header自定义 Spring Integration Web Service SOAP Envelope/Header
【发布时间】:2016-09-08 20:08:51
【问题描述】:

我正在尝试使用 Spring Integration 发送 SOAP 请求,例如

<int:chain input-channel="wsOutChannel" output-channel="stdoutChannel">
    <int-ws:header-enricher>
        <int-ws:soap-action value="..."/>
    </int-ws:header-enricher>
    <int-ws:outbound-gateway
            uri="..."/>
</int:chain>

但你只能添加 SOAP 主体,而 Spring Integration 会添加信封、标头和主体标签,如

<SOAP-ENV:Envelope>
    <SOAP-ENV:Header>
        <SOAP-ENV:Body>
            ...
        </SOAP-ENV:Body>
    <SOAP-ENV:Header>
</SOAP-ENV:Envelope>

我需要自定义带有特定属性的信封和标题标签,例如:

<soapenv:Envelope attribute1="value1" attribute2="value2">

和子元素,例如:

<soapenv:Header>
    <child>...<child>
<soapenv:Header>

这可以通过 Spring Integration Web 服务实现吗,还是我不应该使用 int-ws:outbound-gateway 并采取不同的方法?

【问题讨论】:

    标签: soap spring-integration spring-ws


    【解决方案1】:

    您可以添加一个ClientInterceptor(通过interceptor 属性),它允许您在请求发出之前对其进行修改。

    编辑

    @Artem 的建议更简单,但拦截器也可以让您访问响应;但无论哪种方式,代码都是相似的。

    对于拦截器:

    public class MyInterceptor extends ClientInterceptorAdapter {
    
        @Override
        public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
            SoapMessage request = (SoapMessage) messageContext.getRequest();
            SoapEnvelope envelope = request.getEnvelope();
            envelope.addAttribute(new QName("foo"), "bar");
            SoapHeader header = envelope.getHeader();
            header.addHeaderElement(new QName("http://fiz/buz", "baz"));
            return super.handleRequest(messageContext);
        }
    
    }
    

    对于回调版本:

    @Override
    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
        SoapEnvelope envelope = ((SoapMessage) message).getEnvelope();
        envelope.addAttribute(new QName("foo"), "bar");
        SoapHeader header = envelope.getHeader();
        header.addHeaderElement(new QName("http://fiz/buz", "baz"));
    }
    

    【讨论】:

      【解决方案2】:

      我觉得你可以注入WebServiceMessageCallback:

      <xsd:attribute name="request-callback" type="xsd:string">
                  <xsd:annotation>
                      <xsd:documentation>
      Reference to a Spring Web Services WebServiceMessageCallback. This enables changing
      the Web Service request message after the payload has been written to it but prior
      to invocation of the actual Web Service.
                      </xsd:documentation>
                      <xsd:appinfo>
                          <tool:annotation kind="ref">
                              <tool:expected-type type="org.springframework.ws.client.core.WebServiceMessageCallback"/>
                          </tool:annotation>
                      </xsd:appinfo>
                  </xsd:annotation>
              </xsd:attribute>
      

      并将消息投射到SoapMessage 并使用其getEnvelope() 自定义所需的方式。

      【讨论】:

      • 是的,这更简单 - 我为这两种技术添加了代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多