0
votes

I am working on a spring integration component where I posting data to external third-party URL. and Its is working fine with the below code.

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

Below is payload received by third part 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>

Now, I have to add an additional security feature and send the API key in the HTTP header or soap header. SO I modified my code as below. Now I can see API key is sent as soap header but some how SOAPAction is going empty, not sure why.

below is the modified code to send api ket as part of soap header.

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

After adding mapped-request-headers now I am getting

org.springframework.messaging.MessagingException: The message could not be processed because the action '' is invalid or unrecognized.; nested exception is org.springframework.ws.soap.client.SoapFaultClientException: The message could not be processed because the action '' is invalid or unrecognized., failedMessage=GenericMessage

when I checked the payload received by thirdparty api I can see SOAP action is empty I am not sure why.

Please help me.

Thanks.

<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

1 Answers

1
votes

The mapped-request-headers="soapHeaderMapper" is wrong configuration. It is exactly about names, but in your case you try to make a reference to the DefaultSoapHeaderMapper bean definition.

Consider to use:

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

instead.

Also there is the with your header names to map: when you configure some custom header names, all the standard headers are missed. So, alongside with the api-key, you need to consider include the mentioned ws_soapAction name as well.