You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ode.apache.org by Σπύρος Αναστασόπουλος <wi...@gmail.com> on 2009/06/01 13:12:16 UTC

ODE and SOAP Headers

Hi

I have a problem with the use of SOAP headers.

I want to implement a BPEL process that receives
a message, adds a SOAP Header and passes it to a
second web service.

The wsdl for the bpel process has not a header binding
since it is not required.

The wsdl for the second process has a header binding

<wsdl:message name="CachePairRequest">
  <wsdl:part name="parameters" element="tns:CachePair"/>
  <wsdl:part name="cacheID" element="tns:CacheID"/>
</wsdl:message>

<wsdl:operation name="CachePair">
  <soap:operation soapAction="http://www.stark.org/Cache/CachePair"
style="document"/>
  <wsdl:input>
    <soap:header message="tns:CachePairRequest" part="cacheID" use="literal"/>
    <soap:body message="tns:CachePairRequest" parts="parameters" use="literal"/>
  </wsdl:input>
</wsdl:operation>

I believe that the wsdl is correct. I use the JDK 6 wsimport tool
and the generated client code correctly handles the SOAP header.

The bpel snippet for the header is
<assign>
  <copy>
  <from><literal>
  <CacheID xmlns="http://www.stark.org/Cache">BADC0C0A</CacheID>
  </literal></from>
  <to>$CacheRequest.cacheID</to>
  </copy>
</assign>

However when i run it, an error message is logged

org.apache.ode.axis2.OdeFault: Message is missing required part: cacheID

        at org.apache.ode.axis2.util.SoapMessageConverter.handleSoapHeaderDef(So
apMessageConverter.java:245)
        at org.apache.ode.axis2.util.SoapMessageConverter.createSoapHeaders(Soap
MessageConverter.java:210)
        at org.apache.ode.axis2.util.SoapMessageConverter.createSoapRequest(Soap
MessageConverter.java:166)
        at org.apache.ode.axis2.SoapExternalService.invoke(SoapExternalService.j
ava:123)
        at org.apache.ode.axis2.MessageExchangeContextImpl.invokePartner(Message
ExchangeContextImpl.java:52)
        at org.apache.ode.bpel.engine.BpelRuntimeContextImpl.invoke(BpelRuntimeC
ontextImpl.java:772)
        at org.apache.ode.bpel.runtime.INVOKE.run(INVOKE.java:100)
        at sun.reflect.GeneratedMethodAccessor180.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.ode.jacob.vpu.JacobVPU$JacobThreadImpl.run(JacobVPU.java:4
51)
        at org.apache.ode.jacob.vpu.JacobVPU.execute(JacobVPU.java:139)
        at org.apache.ode.bpel.engine.BpelRuntimeContextImpl.execute(BpelRuntime
ContextImpl.java:847)
        at org.apache.ode.bpel.engine.PartnerLinkMyRoleImpl.invokeNewInstance(Pa
rtnerLinkMyRoleImpl.java:203)
        at org.apache.ode.bpel.engine.BpelProcess.invokeProcess(BpelProcess.java
:202)
        at org.apache.ode.bpel.engine.BpelProcess.handleWorkEvent(BpelProcess.ja
va:370)
        at org.apache.ode.bpel.engine.BpelEngineImpl.onScheduledJob(BpelEngineIm
pl.java:415)
        at org.apache.ode.bpel.engine.BpelServerImpl.onScheduledJob(BpelServerIm
pl.java:377)
        at org.apache.ode.scheduler.simple.SimpleScheduler$4$1.call(SimpleSchedu
ler.java:386)
        at org.apache.ode.scheduler.simple.SimpleScheduler$4$1.call(SimpleSchedu
ler.java:380)
        at org.apache.ode.scheduler.simple.SimpleScheduler.execTransaction(Simpl
eScheduler.java:208)
        at org.apache.ode.scheduler.simple.SimpleScheduler$4.call(SimpleSchedule
r.java:379)
        at org.apache.ode.scheduler.simple.SimpleScheduler$4.call(SimpleSchedule
r.java:376)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
utor.java:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:907)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: Message is missing required part:
 cacheID
        at org.apache.ode.utils.wsdl.Messages.msgOdeMessageMissingRequiredPart(M
essages.java:164)
        ... 28 more

It seems that the message generated by ODE is invalid.

The assignment passes without errors. If for example
i enter a non-existent part like cacheIDAAAA then an
error message is displayed during deployment.

Also if i change the wsdl to

<soap:body message="tns:CachePairRequest" parts="parameters cacheID"
use="literal"/>

and remove the header binding
then the CacheID element is correctly appended to the SOAP Body.

I tested against both ODE 1.2 and 1.3.2 running on tomcat 6.0.18
and the problem remains.
Can anyone provide an example of correct SOAP Header usage or
give me some hints to find the error?

Thanks in advance
Anastasopoulos Spyros

Re: ODE and SOAP Headers

Posted by Matthieu Riou <ma...@gmail.com>.
2009/6/1 Σπύρος Αναστασόπουλος <wi...@gmail.com>

> Hi
>
> I have a problem with the use of SOAP headers.
>
> I want to implement a BPEL process that receives
> a message, adds a SOAP Header and passes it to a
> second web service.
>
> The wsdl for the bpel process has not a header binding
> since it is not required.
>
> The wsdl for the second process has a header binding
>
> <wsdl:message name="CachePairRequest">
>  <wsdl:part name="parameters" element="tns:CachePair"/>
>  <wsdl:part name="cacheID" element="tns:CacheID"/>
> </wsdl:message>
>
> <wsdl:operation name="CachePair">
>  <soap:operation soapAction="http://www.stark.org/Cache/CachePair"
> style="document"/>
>  <wsdl:input>
>    <soap:header message="tns:CachePairRequest" part="cacheID"
> use="literal"/>
>    <soap:body message="tns:CachePairRequest" parts="parameters"
> use="literal"/>
>  </wsdl:input>
> </wsdl:operation>
>
> I believe that the wsdl is correct. I use the JDK 6 wsimport tool
> and the generated client code correctly handles the SOAP header.
>
> The bpel snippet for the header is
> <assign>
>  <copy>
>  <from><literal>
>  <CacheID xmlns="http://www.stark.org/Cache">BADC0C0A</CacheID>
>  </literal></from>
>  <to>$CacheRequest.cacheID</to>
>  </copy>
> </assign>
>
> However when i run it, an error message is logged
>
> org.apache.ode.axis2.OdeFault: Message is missing required part: cacheID
>

Have you looked at this?

http://ode.apache.org/headers-handling.html

The section about dynamic headers in particular might help.

Matthieu



>
>        at
> org.apache.ode.axis2.util.SoapMessageConverter.handleSoapHeaderDef(So
> apMessageConverter.java:245)
>        at
> org.apache.ode.axis2.util.SoapMessageConverter.createSoapHeaders(Soap
> MessageConverter.java:210)
>        at
> org.apache.ode.axis2.util.SoapMessageConverter.createSoapRequest(Soap
> MessageConverter.java:166)
>        at
> org.apache.ode.axis2.SoapExternalService.invoke(SoapExternalService.j
> ava:123)
>        at
> org.apache.ode.axis2.MessageExchangeContextImpl.invokePartner(Message
> ExchangeContextImpl.java:52)
>        at
> org.apache.ode.bpel.engine.BpelRuntimeContextImpl.invoke(BpelRuntimeC
> ontextImpl.java:772)
>        at org.apache.ode.bpel.runtime.INVOKE.run(INVOKE.java:100)
>        at sun.reflect.GeneratedMethodAccessor180.invoke(Unknown Source)
>        at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
> sorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at
> org.apache.ode.jacob.vpu.JacobVPU$JacobThreadImpl.run(JacobVPU.java:4
> 51)
>        at org.apache.ode.jacob.vpu.JacobVPU.execute(JacobVPU.java:139)
>        at
> org.apache.ode.bpel.engine.BpelRuntimeContextImpl.execute(BpelRuntime
> ContextImpl.java:847)
>        at
> org.apache.ode.bpel.engine.PartnerLinkMyRoleImpl.invokeNewInstance(Pa
> rtnerLinkMyRoleImpl.java:203)
>        at
> org.apache.ode.bpel.engine.BpelProcess.invokeProcess(BpelProcess.java
> :202)
>        at
> org.apache.ode.bpel.engine.BpelProcess.handleWorkEvent(BpelProcess.ja
> va:370)
>        at
> org.apache.ode.bpel.engine.BpelEngineImpl.onScheduledJob(BpelEngineIm
> pl.java:415)
>        at
> org.apache.ode.bpel.engine.BpelServerImpl.onScheduledJob(BpelServerIm
> pl.java:377)
>        at
> org.apache.ode.scheduler.simple.SimpleScheduler$4$1.call(SimpleSchedu
> ler.java:386)
>        at
> org.apache.ode.scheduler.simple.SimpleScheduler$4$1.call(SimpleSchedu
> ler.java:380)
>        at
> org.apache.ode.scheduler.simple.SimpleScheduler.execTransaction(Simpl
> eScheduler.java:208)
>        at
> org.apache.ode.scheduler.simple.SimpleScheduler$4.call(SimpleSchedule
> r.java:379)
>        at
> org.apache.ode.scheduler.simple.SimpleScheduler$4.call(SimpleSchedule
> r.java:376)
>        at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>        at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
> utor.java:885)
>        at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
> .java:907)
>        at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.IllegalArgumentException: Message is missing required
> part:
>  cacheID
>        at
> org.apache.ode.utils.wsdl.Messages.msgOdeMessageMissingRequiredPart(M
> essages.java:164)
>        ... 28 more
>
> It seems that the message generated by ODE is invalid.
>
> The assignment passes without errors. If for example
> i enter a non-existent part like cacheIDAAAA then an
> error message is displayed during deployment.
>
> Also if i change the wsdl to
>
> <soap:body message="tns:CachePairRequest" parts="parameters cacheID"
> use="literal"/>
>
> and remove the header binding
> then the CacheID element is correctly appended to the SOAP Body.
>
> I tested against both ODE 1.2 and 1.3.2 running on tomcat 6.0.18
> and the problem remains.
> Can anyone provide an example of correct SOAP Header usage or
> give me some hints to find the error?
>
> Thanks in advance
> Anastasopoulos Spyros
>