Отсутствует действие soap :: Весенняя интеграция

#spring #spring-integration #spring-ws

#весна #весенняя интеграция #spring-ws

Вопрос:

Я работаю над компонентом интеграции spring, в котором я отправляю данные на внешний сторонний URL. и оно отлично работает с приведенным ниже кодом.

 <!-- language: lang-xml -->
    <int:chain id="channe.id"
                input-channel="request.in"
                output-channel="reply.channel">

                <int-ws:header-enricher>
                    <int-ws:soap-action
                        value="${service.soapaction}" />
                </int-ws:header-enricher>
                <int-ws:outbound-gateway
                    id="invoker.ws.outbound.gateway"
                    ignore-empty-responses="true" message-sender="message.sender"
                    interceptors="${SecurityInterceptor}"
                    message-factory="${mmessageFactory}"

                    uri="${protocol}://${host}:${port}/{endpoint}">
                    <int-ws:uri-variable name="endpoint"
                        expression="headers.endpoint" />
                    <int-ws:request-handler-advice-chain>
                        <ref bean="commonRetryAdviceBean" />
                    </int-ws:request-handler-advice-chain>
                </int-ws:outbound-gateway>
            </int:chain>
  

Ниже приведена полезная нагрузка, получаемая api третьей части.

 <MessageLogTraceRecord>
<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<Content-Length>9381</Content-Length>
<Content-Type>text/xml; charset=UTF-8</Content-Type>
<Accept>text/xml</Accept>
<Accept-Encoding>gzip</Accept-Encoding>
<Host>myhost</Host>
<User-Agent>Jakarta Commons-HttpClient/3.1</User-Agent>
<SOAPAction>"http://www.mysoap.com/action/update"</SOAPAction>
</WebHeaders>
  

Теперь мне нужно добавить дополнительную функцию безопасности и отправить ключ API в заголовке HTTP или soap. ИТАК, я изменил свой код, как показано ниже. Теперь я вижу, что ключ API отправляется как заголовок soap, но некоторые SOAPAction становятся пустыми, не уверен, почему.

ниже приведен измененный код для отправки api ket как части заголовка soap.

 <int:chain id="channe.id"
        input-channel="request.in"
        output-channel="reply.channel">

        <int-ws:header-enricher>
            <int-ws:soap-action
                value="${service.soapaction}" />
        </int-ws:header-enricher>
        <int-ws:outbound-gateway
            id="invoker.ws.outbound.gateway"
            ignore-empty-responses="true" message-sender="message.sender"
            interceptors="${SecurityInterceptor}"
            message-factory="${mmessageFactory}"
            mapped-request-headers="soapHeaderMapper"
            uri="${protocol}://${host}:${port}/{endpoint}">
            <int-ws:uri-variable name="endpoint"
                expression="headers.endpoint" />
            <int-ws:request-handler-advice-chain>
                <ref bean="commonRetryAdviceBean" />
            </int-ws:request-handler-advice-chain>
        </int-ws:outbound-gateway>
    </int:chain>


    <bean id="soapHeaderMapper"
        class="org.springframework.integration.ws.DefaultSoapHeaderMapper">
        <property name="requestHeaderNames">
            <list>
                <value>api-key</value>
            </list>
        </property>
    </bean>
  

После добавления сопоставленных заголовков запроса теперь я получаю

org.springframework.обмен сообщениями.Исключение MessagingException: сообщение не удалось обработать, поскольку действие » недопустимо или нераспознано.; вложенным исключением является исключение org.springframework.ws.soap.client.SoapFaultClientException: сообщение не удалось обработать, поскольку действие » недопустимо или нераспознано., failedMessage=GenericMessage

когда я проверил полезную нагрузку, полученную сторонним api, я вижу, что действие SOAP пустое, я не уверен, почему.

Пожалуйста, помогите мне.

Спасибо.

 <QueryString></QueryString>
<WebHeaders>
<Content-Length>9463</Content-Length>
<Content-Type>text/xml; charset=UTF-8</Content-Type>
<Accept>text/xml</Accept>
<Accept-Encoding>gzip</Accept-Encoding>
<Host>myhost</Host>
<User-Agent>Jakarta Commons-HttpClient/3.1</User-Agent>
<SOAPAction>""</SOAPAction>
</WebHeaders>
</HttpRequest>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header api-key="dummy-123455555uuuuuuuuuuuqwert">
  

Ответ №1:

mapped-request-headers="soapHeaderMapper" Неправильная конфигурация. Речь идет именно об именах, но в вашем случае вы пытаетесь сделать ссылку на DefaultSoapHeaderMapper определение компонента.

Подумайте о том, чтобы использовать:

         <xsd:attribute name="header-mapper">
            <xsd:annotation>
                <xsd:documentation>
                    Reference to a SoapHeaderMapper implementation
                    that this gateway will use to map between Spring Integration
                    MessageHeaders and the SoapHeader.
                </xsd:documentation>
                <xsd:appinfo>
                    <tool:annotation kind="ref">
                        <tool:expected-type type="org.springframework.integration.ws.SoapHeaderMapper"/>
                    </tool:annotation>
                </xsd:appinfo>
            </xsd:annotation>
        </xsd:attribute>
  

вместо этого.

Также необходимо сопоставить с вашими именами заголовков: когда вы настраиваете некоторые пользовательские имена заголовков, все стандартные заголовки пропущены. Итак, наряду с api-key , вам также необходимо рассмотреть возможность включения упомянутого ws_soapAction имени.