MTOM proxy via cxf MESSAGE mode to http4

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

MTOM proxy via cxf MESSAGE mode to http4

Enritsche
Hi.

I am struggling to get an MTOM attached soap message through my camel proxy.
It seems the content type is changed somewhere in the route. The "multipart/related" with the multipart boundary gets lost. I am using the MESSAGE data format for transferring the whole request. Without MTOM everything works ok.

My Spring config is as follows:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:camel="http://camel.apache.org/schema/spring"
        xmlns:cxf="http://camel.apache.org/schema/cxf"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
                http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf-spring.xsd">

        <camelContext id="myContext" xmlns="http://camel.apache.org/schema/spring">
                <route id="myRoute" streamCache="true">
                        <from uri="cxf:bean:myCxfEndpoint" />
                        <to uri="http4://realwebservice&amp;bridgeEndpoint=true&amp;okStatusCodeRange=200-499&amp;throwExceptionOnFailure=false" />
                </route>
        </camelContext>

        <cxf:cxfEndpoint id="myCxfEndpoint"
                publishedEndpointUrl="https://somewhere"
                address="/path/to/adress"
                endpointName="e:Production"
                serviceName="e:Service"
                wsdlURL="wsdl/myService.wsdl"
                xmlns:e="https://namespace">
                <cxf:properties>
                        <entry key="dataFormat" value="MESSAGE" />
                        <entry key="mtom-enabled" value="true" /> 
                </cxf:properties>
        </cxf:cxfEndpoint>
</beans>

My current workaround is to set the content-type manually via a processor in between to the content-type out of the CamelCxfMessage:

public class CxfPropagateContentTypeProcessor implements Processor {

    @Override
    public void process(final Exchange exchange) throws Exception {
        final Map<String, Object> properties = exchange.getProperties();
        if (properties.containsKey(CxfConstants.DATA_FORMAT_PROPERTY)) {
            final DataFormat dataFormat = (DataFormat) properties.get(CxfConstants.DATA_FORMAT_PROPERTY);
            // this is not supported normally, we use it just as a marker
            final String mtomProperty = (String) properties.get("mtom-enabled");

            if (exchange.getFromEndpoint() instanceof CxfEndpoint && dataFormat == DataFormat.MESSAGE && "true".equals(mtomProperty)) {
                final Message message = exchange.getIn();
                final Map<String, Object> messageHeaders = message.getHeaders();

                // extract the CXF message (TODO there may be an official way to
                // get this)
                final SoapMessage soapMessage = (SoapMessage) messageHeaders.get(CxfConstants.CAMEL_CXF_MESSAGE);
                if (soapMessage != null) {
                    message.setHeader(Exchange.CONTENT_TYPE, soapMessage.get(Exchange.CONTENT_TYPE));
                }
            }
        }
    }
}

I think there should be a simpler approach. Could this be a bug in the cxf component?

BR
Erich
Loading...