You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by angeloNZ <an...@nz.fujitsu.com> on 2009/03/04 23:41:30 UTC
Operation not bound on this message error
Hi,
This is my current use case:
client -> http consumer -> http consumer marshaler -> saxon -> http soap
provider -> external soap service
1. The client initiates a GET request passing in a username in the query
string
2. A consumer marshaler receives the request and creates an adhoc xml body
containing the username. The xml is constructed as a string and set as the
content of the NormalizedMessage inside createExchange().
3. the http consumer's target service is a camel pipeline which has 2
endpoints defined: (according to order)
- saxon service
- http soap provider
4. the saxon service applies xslt on the adhoc xml body and creates a SOAP
request containing the passed in username:
XSLT:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'>
<xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>
<xsl:template match="/">
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:rem="http://remote.service.com">
<soapenv:Header/>
<soapenv:Body>
<rem:getXMLFeed>
<rem:userName><xsl:value-of select="//username"/></rem:userName>
</rem:getXMLFeed>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>
5. the http soap provider is then called, but here is where the error
occurs. Here's a log of the error:
org.apache.servicemix.soap.api.Fault: Operation not bound on this message
at
org.apache.servicemix.soap.interceptors.jbi.JbiOutWsdl1Interceptor.getOperation(JbiOutWsdl1Interceptor.java:225)
at
org.apache.servicemix.soap.interceptors.jbi.JbiOutWsdl1Interceptor.handleMessage(JbiOutWsdl1Interceptor.java:73)
at
org.apache.servicemix.soap.core.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:85)
at
org.apache.servicemix.http.endpoints.HttpSoapProviderMarshaler.createRequest(HttpSoapProviderMarshaler.java:98)
at
org.apache.servicemix.http.endpoints.HttpProviderEndpoint.process(HttpProviderEndpoint.java:202)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:600)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:554)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(AsyncBaseLifeCycle.java:510)
at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(SyncLifeCycleWrapper.java:60)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:168)
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)
--------------------------------------------------
To verify that my http:soap-provider endpoint was configured correctly I
tried creating a http:soap-consumer that directly calls the soap-provider
without any other components in between and the result was Ok. Any thoughts
on what I could be missing here? The soap message I defined in the xslt
body is exactly what I used when sending requests to the http:soap-consumer
I created.
I verified that HttpSoapProviderMarshaler uses POST to create the request.
I also tried implementing my own soapprovidermarshaler which only added
log.debug() statements to get an idea of the message body and noticed that
if I send a POST request through the soap:consumer the message body arriving
at the provider marshaler is a StaxSource instance something like:
<?xml version="1.0" encoding="UTF-8"?>
<jbi:message ...
<jbi:part>
.... { same as my soap request body }
</jbi:part>
</jbi:message>
whereas a DomSource instance is generated if I go through my original use
case.
Any help is highly appreciated.
--
View this message in context: http://www.nabble.com/Operation-not-bound-on-this-message-error-tp22341199p22341199.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.
Re: Operation not bound on this message error
Posted by angeloNZ <an...@nz.fujitsu.com>.
Update:
I was able to get this working. Instead of using an http:soap-provider I
used a <cxfbc:provider> endpoint instead. I also had to change my XSLT's
template body not to use the <soap:Envelope> wrapper because servicemix
expects the message to have the <jbi:message>.
so my modified xslt body now looks like:
<jbi:message xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"
version="1.0">
<jbi:part>
<rem:getXMLFeed xmlns:rem="http://remote.service.com">
<rem:userName><xsl:value-of select="//username"/></rem:userName>
</rem:getXMLFeed>
</jbi:part>
</jbi:message>
I don't understand why the http:soap-provider did not work though so
explainations would be appreciated. During my attempts to use the
http:soap-provider I used a <jbi:message> template body as well however the
"operation not bound on this message" error keeps appearing.
I guess this entire approach is a good way to proxy an external SOAP service
as a RESTful service from within the ESB. The only thing left to do is to
remove any jbi wrappers that gets sent back in the XML response.
angeloNZ wrote:
>
> Hi,
>
> This is my current use case:
>
> client -> http consumer -> http consumer marshaler -> saxon -> http soap
> provider -> external soap service
>
> 1. The client initiates a GET request passing in a username in the query
> string
> 2. A consumer marshaler receives the request and creates an adhoc xml
> body containing the username. The xml is constructed as a string and set
> as the content of the NormalizedMessage inside createExchange().
> 3. the http consumer's target service is a camel pipeline which has 2
> endpoints defined: (according to order)
> - saxon service
> - http soap provider
> 4. the saxon service applies xslt on the adhoc xml body and creates a
> SOAP request containing the passed in username:
>
> XSLT:
>
> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
> version='1.0'>
> <xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>
> <xsl:template match="/">
>
> <soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
> xmlns:rem="http://remote.service.com">
> <soapenv:Header/>
> <soapenv:Body>
> <rem:getXMLFeed>
> <rem:userName><xsl:value-of select="//username"/></rem:userName>
> </rem:getXMLFeed>
> </soapenv:Body>
> </soapenv:Envelope>
> </xsl:template>
>
> </xsl:stylesheet>
>
> 5. the http soap provider is then called, but here is where the error
> occurs. Here's a log of the error:
>
> org.apache.servicemix.soap.api.Fault: Operation not bound on this message
> at
> org.apache.servicemix.soap.interceptors.jbi.JbiOutWsdl1Interceptor.getOperation(JbiOutWsdl1Interceptor.java:225)
> at
> org.apache.servicemix.soap.interceptors.jbi.JbiOutWsdl1Interceptor.handleMessage(JbiOutWsdl1Interceptor.java:73)
> at
> org.apache.servicemix.soap.core.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:85)
> at
> org.apache.servicemix.http.endpoints.HttpSoapProviderMarshaler.createRequest(HttpSoapProviderMarshaler.java:98)
> at
> org.apache.servicemix.http.endpoints.HttpProviderEndpoint.process(HttpProviderEndpoint.java:202)
> at
> org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:600)
> at
> org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:554)
> at
> org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(AsyncBaseLifeCycle.java:510)
> at
> org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(SyncLifeCycleWrapper.java:60)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
> at
> org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
> at
> org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:168)
> 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)
>
> --------------------------------------------------
>
> To verify that my http:soap-provider endpoint was configured correctly I
> tried creating a http:soap-consumer that directly calls the soap-provider
> without any other components in between and the result was Ok. Any
> thoughts on what I could be missing here? The soap message I defined in
> the xslt body is exactly what I used when sending requests to the
> http:soap-consumer I created.
>
> I verified that HttpSoapProviderMarshaler uses POST to create the request.
> I also tried implementing my own soapprovidermarshaler which only added
> log.debug() statements to get an idea of the message body and noticed that
> if I send a POST request through the soap:consumer the message body
> arriving at the provider marshaler is a StaxSource instance something
> like:
> <?xml version="1.0" encoding="UTF-8"?>
> <jbi:message ...
> <jbi:part>
> .... { same as my soap request body }
> </jbi:part>
> </jbi:message>
>
> whereas a DomSource instance is generated if I go through my original use
> case.
>
> Any help is highly appreciated.
>
--
View this message in context: http://www.nabble.com/Operation-not-bound-on-this-message-error-tp22341199p22363516.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.