I was able to workaround this problem by explicitly setting the operation on 
the eip:pipeline transformer's exchange-target. 

However, if I use a servicemix-http soap-provider as the transformer instead of 
a cxfbc:provider, the transformer's exchange-target operation need not be set. 

Is there a reason why the cxfbc:provider requires the operation and the 
servicemix-http does not?

Also, during my research, I noticed that there is some operation-handling code 
in CxfBcProvider to derive the operation if the interface has only one of them. 
It appears this logic should also be either included in 
CxfBcProviderMessageObserver (as listed below) or the calculated 
BindingOperationInfo in CxfBcProvider should be passed in the constructor into 
CxfBcProviderMessageObserver. 

Let me know if I should open a JIRA for this issue.

Thanks,

- Ron

CxfBcProviderMessageObserver.java
...
    public void onMessage(Message message) {
        try {
            if (messageExchange.getStatus() != ExchangeStatus.ACTIVE) {
                return;
            }

            contentType = (String) message.get(Message.CONTENT_TYPE);
            SoapMessage soapMessage = 
                (SoapMessage) 
this.providerEndpoint.getCxfEndpoint().getBinding().createMessage(message);

            EndpointInfo ei = providerEndpoint.getEndpointInfo();

            QName opeName = messageExchange.getOperation();
            BindingOperationInfo boi = null;
            if (opeName == null) {
                // if interface only have one operation, may not specify the 
opeName in MessageExchange
                boi = ei.getBinding().getOperations().iterator().next();
            } else {
                boi = ei.getBinding().getOperation(opeName);   
            }
            
            // create XmlStreamReader
            if (boi.getOperationInfo().isOneWay()) {
                return;
            }
...

----- Original Message ----
From: Ron Gavlin <[EMAIL PROTECTED]>
To: [email protected]
Sent: Wednesday, May 14, 2008 2:25:11 AM
Subject: servicemix-cxf-bc provider NPE invoking cxf-wsdl-first sample

Using the current 3.2 branch, I have hot deployed the cxf-wsdl-first sample. In 
a separate flow, I have a file:poller -> eip:pipeline(transformer = 
cxfbc:provider) -> file:sender. My input file for this flow contains:

<jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"; 
version="1.0">
<jbi:part>
<tns:GetPerson 
xmlns:tns="http://servicemix.apache.org/samples/wsdl-first/types";>
      <tns:personId>world</tns:personId>
</tns:GetPerson>
</jbi:part>
</jbi:message>

When this flow is processed, the cxfbc:provider throws the following NPE:

May 14, 2008 1:59:44 AM org.apache.cxf.transport.jbi.JBITransportFactory 
setDeliveryChannel
INFO: configuring DeliveryChannel:      [EMAIL PROTECTED]
May 14, 2008 1:59:45 AM org.apache.cxf.transport.jbi.JBITransportFactory 
setDeliveryChannel
INFO: configuring DeliveryChannel:      [EMAIL PROTECTED]
java.lang.NullPointerException
        at 
java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:157)
        at 
java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:730)
        at 
org.apache.cxf.service.model.BindingInfo.getOperation(BindingInfo.java:126)
        at 
org.apache.servicemix.cxfbc.CxfBcProviderMessageObserver.onMessage(CxfBcProviderMessageObserver.java:93)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1988)
        at 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1824)
        at 
org.apache.servicemix.cxfbc.CxfBcProvider.process(CxfBcProvider.java:201)
        at 
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:538)
        at 
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:490)
        at 
org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
        at 
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:610)
        at 
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
        at 
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:167)
        at 
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
        at java.lang.Thread.run(Thread.java:595)

The problem is that the CxfBcProviderMessageObserver's messageExchange has a 
null operation. On the cxfbc:provider, how is the operation supposed to be set? 
I do not see it as a configurable property on the cxfbc:provider.

Thanks in advance for your assistance.

- Ron

Reply via email to