Как установить заголовок конверта SOAP в Spring для интеграции с данными из int-http:inbound-gateway?

Я попытался создать простой проект интеграции Spring, в котором я получаю запрос REST и преобразовываю его в запрос SOAP. Что-то типа:

<int-http:inbound-gateway id="rest-inbound-gateway" request-channel="restRequestChannel"
    reply-channel="restOutputChannel" supported-methods="POST"
    path="/somepath" request-payload-type="com.something.RequestObject">
        <int-http:request-mapping consumes="application/json" produces="application/json" />
</int-http:inbound-gateway>

<int:transformer ref="RestToSoapTransformer" method="transform"
                 input-channel="restRequestChannel" output-channel="transformedChannel"/>

<int-ws:outbound-gateway id="marshallingGateway"
    request-channel="transformedChannel" reply-channel="restOutputChannel"
    uri="http://localhost:8088/mockSoapBinding" marshaller="marshaller"
    message-sender="messageSender"
    unmarshaller="marshaller" >
</int-ws:outbound-gateway>

Но некоторые сведения, содержащиеся в запросе REST, необходимо помещать в заголовок конверта SAOP, а не в тело конверта. Например.

РЕСТ-запрос:

{
    "foo": "foo",
    "bar": "bar"
}

И запрос SOAP должен быть:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <foo>foo</foo>
    </soapenv:Header>
    <soapenv:Body>
         <bar>bar</bar>
    </soapenv:Body>
</soapenv:Envelope>

Как я могу это сделать? Преобразователь создает только тело мыла, а в перехватчике или преобразователе заголовков у меня больше нет исходного запроса. Есть ли способ сделать это?


person prophet4955    schedule 29.10.2018    source источник


Ответы (1)


См. документацию.

Заголовки сообщений WS

Шлюзы WebService Spring Integration автоматически сопоставят заголовок действия SOAP. По умолчанию он будет скопирован в и из Spring Integration MessageHeaders с помощью DefaultSoapHeaderMapper.

Конечно, вы можете передать свою собственную реализацию специальных преобразователей заголовков SOAP, поскольку шлюзы имеют соответствующие свойства для поддержки этого.

Любые определяемые пользователем заголовки SOAP НЕ будут копироваться в сообщение SOAP или из него, если это явно не указано в свойствах requestHeaderNames и/или replyHeaderNames объекта DefaultSoapHeaderMapper.

...

person Gary Russell    schedule 29.10.2018
comment
Извините, что двусмысленно написал вопрос. Мне нужно установить заголовок конверта SOAP, а не заголовок действия мыла. Я расширил вопрос. - person prophet4955; 30.10.2018
comment
Это именно то, что описывает документация Any user-defined SOAP headers will NOT be copied to or from a SOAP Message, unless explicitly specified by the requestHeaderNames and/or replyHeaderNames properties of the DefaultSoapHeaderMapper.. Добавьте <header-enricher/> перед шлюзом, чтобы добавить заголовки, затем настройте преобразователь для их сопоставления с помощью свойства requestHeaderNames. - person Gary Russell; 30.10.2018
comment
Спасибо! Теперь, если я верну строку в моем <header-enricher/>, она будет в заголовке, например `‹SOAP-ENV:Header foo=bar/›. Есть ли способ поместить его под элемент заголовка в отдельный тег? Если я возвращаю объект или JAXBElement, он вообще не отображается в заголовке. - person prophet4955; 31.10.2018
comment
См. документацию, на которую я вам указал. Вы можете использовать StringSource в качестве значения заголовка — прокрутите вниз до конца этого раздела. - person Gary Russell; 31.10.2018