2016-09-08 14 views
1

Я пытаюсь отправить запрос SOAP с использованием Spring Integration, какНастройка Spring Integration Web Service SOAP Envelope/Header

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

Является ли это возможно с пружинной интеграцией веб-службами, или я не должен использовать int-ws:outbound-gateway и взять другой подход?

ответ

1

Вы можете добавить ClientInterceptor (через атрибут interceptor), который позволяет вам изменить запрос до его отправки.

EDIT

@ предложение Артема проще, но перехватчик дает вам доступ к ответу тоже; но в любом случае код аналогичен.

Для перехватчика:

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")); 
} 
1

я, что вы можете впрыснуть 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(), чтобы настроить желаемый путь.

+0

Да, это проще - я добавил код к моему ответу для обеих техник. –