Hi,

My gut feeling is that this issue is kinda of similar with the one I encountered with servicemix-cxf-bc JBI component(which means only determine soap version from the servicemodel but ignore the real incoming message), could you do a quick test here? You can add an outInterceptor for your camel-cxf endpoint, the interceptor should be like

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;

public class SetSoapVersionInterceptor extends AbstractSoapInterceptor {

    public SetSoapVersionInterceptor() {
        super(Phase.WRITE);
        addBefore(SoapOutInterceptor.class.getName());
    }
    public void handleMessage(SoapMessage message) throws Fault {
        if (message.getExchange() != null) {
if (message.getExchange().getInMessage() instanceof SoapMessage) { ((SoapMessage )message ).setVersion (((SoapMessage)message.getExchange().getInMessage()).getVersion());
            }
        }
    }

}

Tell me if this can fix it.

Freeman

On 2011-10-17, at 下午6:50, Andrei Shakirin wrote:

Hi,

I have a small issue with Camel CXF component supporting both SOAP bindings: 1.1 and 1.2.

If I take pure CXF service and specify:

@ServiceMode(value = Service.Mode.MESSAGE)
@BindingType(value = "http://www.w3.org/2003/05/soap/bindings/HTTP/";)

this CXF Service accepts both kind of requests: SOAP 1.1 & SOAP 1.2 and expects appropriate responses: SOAP 1.1 response for SOAP 1.1 request and SOAP 1.2 response for SOAP 1.1 request. It works as expected.

If I take Camel CXF component and specify the same annotations for the interface, I have the following behavior: all requests (1.1 & 1.2) is still accepted, but I can provide ONLY 1.2 responses and faults. If I try to set 1.1 response as answer for 1.1 request: exchange.getOut().setBody(response, StaxSource.class);
the following exception is throwing:

11:46:27,411 | WARN | qtp25691505-91 | PhaseInterceptorChain | ache.cxf.comm on.logging.LogUtils 371 | - - | Interceptor for {http://com.dpdhl/cig/facade/v1 }WSFaca de#{http://facade.cig.dpdhl.com/}invoke has thrown exception, unwinding now org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node wher
e it is not permitted.
at com .sun .org .apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocume
ntImpl.java:391)[:1.6.0_22]
at com .sun .org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java: 235)[
:1.6.0_22]
at com .sun .xml.messaging.saaj.soap.SOAPPartImpl.appendChild(SOAPPartImpl.java: 502)
[67:org.apache.servicemix.bundles.saaj-impl:1.3.2.2]
at org .apache .cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.java:11
4)[132:org.apache.cxf.bundle:2.4.2]

Absolutely the same exception is thrown in pure CXF provider if I send wrong version of response (for example 1.1 response for 1.2 request).

Question: is there any possibility to say Camel CXF component that it should accept SOAP 1.1 Response as answer to SOAP 1.1 Request?
Sample code illustrating the problem can be provided if necessary.

Regards,
Andrei.


---------------------------------------------
Freeman Fang

FuseSource
Email:[email protected]
Web: fusesource.com
Twitter: freemanfang
Blog: http://freemanfang.blogspot.com









Reply via email to