2015-02-18 3 views
1

Я пытаюсь написать configure gateway, который должен принять полное сообщение SOAP, а затем передать его другому провайдеру SOAP (включая все заголовки SOAP первого запроса).Spring Integration должен направлять сообщение (с заголовками SOAP)

То, что я сделал до сих пор:

1) web.xml

MessageDispatcherServlet with Mapping: 
<servlet-mapping> 
    <servlet-name>spring-ws</servlet-name> 
    <url-pattern>/appservices/*</url-pattern> 
</servlet-mapping> 

2) Конфигурация с конечной точки Mapping

<bean class="org.springframework.ws.server.endpoint.mapping.UriEndpointMapping"> 
    <property name="defaultEndpoint" ref="ws-in-gw"/> 
</bean> 

3) Конфигурация Spring Integration inbound- шлюз и исходящий-шлюз

<int-ws:inbound-gateway id="ws-in-gw" 
    request-channel="in" 
    reply-channel="out" 
    mapped-request-headers="*" /> 

<int:channel id="in" /> 

<int:channel id="out" /> 

<int-ws:outbound-gateway 
    id="ws-out-gw-status" 
    request-channel="in-status" 
    reply-channel="out-status" 
    uri="http://${delegationServer}/${delegation.contextroot}/soap/AnotherService" 
    interceptor="soapEnricher" 
</int-ws:outbound-gateway> 

<bean id="soapEnricher" class="foo.bar.SoapHeaderEnricher" /> 


public class SoapHeaderEnricher implements ClientInterceptor { 

@Override 
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 

    try { 
     SoapMessage soapMessage = (SoapMessage) messageContext.getRequest(); 
     SoapHeader sh = soapMessage.getSoapHeader(); 
     // can use sh.addHeaderElement(new QName(...)) now, but where are the original Headers??? 
    } catch() { 
    } 
} 

Моя первая проблема заключалась в том, что исходные заголовки SOAP были разрезаны, поэтому я представил атрибут «сопоставленный запрос-заголовки =» * «» на входящем шлюзе. Когда я теперь настроить проводной кран, я вижу заголовки (myToken: MySecretToken) принимаются:

DEBUG 10:46:53 - [Payload DOMSource [email protected]][Headers={errorChannel=org.springframewor[email protected]43456ff4, myToken:MySec[email protected]3b91ead, ...}] 

Это SOAP сообщение для моего теста:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:stat="http://status.service.promakler.provinzial.com/"> 

    <soapenv:Header> 
     <myToken:MySecretToken xmlns="" 
     xmlns:myToken="http://foo.bar">12345</myToken:MySecretToken> 
    </soapenv:Header> 

    <soapenv:Body> 
     <stat:getStatus/> 
    </soapenv:Body> 
</soapenv:Envelope> 

Так Заголовки теперь в моем сообщении, но в ClientInterceptor нет способа получить заголовки (только полезная нагрузка) ?! Я могу добавить новые заголовки, но как я могу получить исходный заголовок? Может кто-нибудь дать мне подсказку (или, возможно, есть даже тихое простое решение ??)

С уважением Тимо

ответ

0

Попробуйте ввести пользовательское расширение DefaultSoapHeaderMapper и переопределить populateUserDefinedHeader для извлечения тех SaajSoapHeaderElement из MessageHeaders и заполнить их до SoapHeader. И, наконец, введите свое решение в header-mapper вашего <int-ws:outbound-gateway>.

+0

Я пытался добавить специальный Mapper (<идентификатор = класс компонента «soapHeaderMapper» = «com.provinzial.promakler.tgicgateway.mapper.PromaklerSoapHeaderMapper» />), который расширяет DefaultSoapHeaderMapper, но метод «populateUserDefinedHeader» никогда не называют , Как это может быть, когда проводник показывает мне заголовок сообщения? –

+0

Настроить его с помощью '' –

+0

Я не знаю, почему это не работает, но я нашел решение: я переопределяю метод fromHeadersToRequest и помещаю его вручную в цель , Большое спасибо ! –

Смежные вопросы