Hi Gisbert,
There is unit test[1] to show how to use the Provider<SOAPMessage>
interface in camel-cxf module, you may take a look as a reference.
[1]
https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfSoapMessageProviderTest.java
Willem
Willem Jiang wrote:
Hi Gisbert,
The default camel-cxf endpoint's dataFormat is POJO, you don't need to
do any additional configuration. The two dataFormat configerations
look good to me.
From your configuration , I found you are using the servlet transport
which might be need some addtional setting on the configuration.
BTW, can you show me the stack trace of your test case for a quick
trouble shot?
Willem
On Fri, Sep 12, 2008 at 12:29 AM, Gisbert Amm <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi Willem,
that sounds promising (and your guesses are right). But HOW to set the
dataFormat? I've tried
<!-- CXF Endpoint for SOAP: My.wsdl -->
<cxf:cxfEndpoint id="MyEndpoint"
address="/MyService"
serviceClass="foo.bar.DummyProvider"
wsdlURL="WEB-INF/wsdl/My.wsdl"
endpointName="s:My-SOAP11-HTTP"
serviceName="s:svMy"
xmlns:s="http://contract/MyAddress/1.2">
<cxf:properties>
<entry key="dataFormat" value="POJO"/>
</cxf:properties>
</cxf:cxfEndpoint>
and
<route>
<from uri="cxf:bean:MyEndpoint?dataFormat=POJO"/>
but neither of them seems to have any effect.
- -Gisbert
Willem Jiang schrieb:
> Hi Gisbert
>
> * NOTE *
> If you set the camel-cxf endpoint dataFormat to be MESSAGE, the in
> message body is not the MessageContentsList any more.
>
> I need to update the camel-cxf wiki page for it.
>
> From the codes that you showed , I think you are using the JAXWS
> Provider Interface as the SEI which provides a low level message
for end
> user to processing and you can get your processor work by
setting the
> endpoint to POJO mode.
>
> Willem
>
> Gisbert Amm wrote:
> Hi again,
>
> the Groovy example unfortunately didn't work for me but I'm
still happy
> with the jxpath variant. Still it would be nice to find out how
to set
> the dataFormat of the endpoint to MESSAGE (which seems to be
plain XML).
> That would provide me with maximum freedom ...
>
> I faced another problem. Code like this in a processor that
worked fine
> with Camel 1.4.0 doesn't work anymore either:
>
> SOAPMessage soapMessage = (SOAPMessage)
> exchange.getIn().getBody(List.class).get(0);
>
> SOAPBody sb = soapMessage.getSOAPPart().getEnvelope().getBody();
>
> String message = (String)
exchange.getIn().getBody(List.class).get(0);
>
> Long contractID =
>
Long.valueOf(sb.getElementsByTagName(CONTRACT_ID).item(0).getTextContent());
>
> ...
>
> As you pointed out, the message body is now of type
> org.apache.cxf.message.MessageContentsList. Is there an example
> somewhere how to retrieve the single values out of this object?
It has a
> method get(MessagePartInfo key), but I don't know how to use
this (the
> org.apache.cxf.service.model.MessagePartInfo object seems to be
rather
> complex).
>
> Regards,
> Gisbert
>
> Gisbert Amm wrote:
>
>>>> Ah, now I understand why I get a ClassCastException :) Not
very user
>>>> friendly, though. I got my routing to work using
>>>> <jxpath>in/headers/@operationName = 'opCreate'</jxpath> in
the meantime
>>>> (mind that the header is "operationName" instead of
"SOAPAction", for
>>>> what reason ever).
>>>>
>>>> I've also tried to set <from
uri="cxf:bean:MyBean?dataFormat=MESSAGE"/>
>>>> following your hint, but this still leads to a
ClassCastException when I
>>>> use xpath later on. However, I'll also give the Groovy
example a go, for
>>>> this looks rather smart :)
>>>>
>>>> Thank you very very much for your help.
>>>>
>>>> -Gisbert
>>>>
>>>> Willem Jiang schrieb:
>>>>
>>>>> Oh, xpath only works for the XML or which can be converted
into the dom
>>>>> object :)
>>>>> <xpath>$SOAPAction = 'create'</xpath>.
>>>>> If you don't specify the dataFormat for your CXF
endpoint, the
>>>>> message
>>>>> body is a list which holds the invocation's parameters. So
camel xpath
>>>>> expression can't convert the list into a dom object for
xpath query.
>>>>> You can use the camel-script[1] to test the header
value, here
>>>>> is an
>>>>> example of spring configuration
>>>>> <camelContext id="camel"
>>>>> xmlns="http://activemq.apache.org/camel/schema/spring">
>>>>> <route>
>>>>> <from uri="direct:start"/>
>>>>> <filter>
>>>>> <groovy>exchange.in.headers.SOAPAction ==
'create'</groovy>
>>>>> <to uri="mock:result"/>
>>>>> </filter>
>>>>> </route>
>>>>> </camelContext>
>>>>> [1]
http://activemq.apache.org/camel/scripting-languages.html
>>>>> Hope these information can help you :)
>>>>> Willem
>>>>> Gisbert Amm wrote:
>>>>> Hi Willem,
>>>>> thank you again. I had seen this $someHeader stuff in
the docs
>>>>> and had
>>>>> tried it out but with 1.4.0 it didn't work. The docs are
obviously a
>>>>> bit
>>>>> ahead of 1.4.0 :)
>>>>> However, I've tried this now:
>>>>> <xpath>$SOAPAction = 'create'</xpath>
>>>>> and get a ClassCastException:
>>>>> java.lang.ClassCastException:
>>>>> org.apache.cxf.message.MessageContentsList
>>>>> at
>>>>>
com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:115)
>>>>>
>>>>> at
>>>>>
com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:97)
>>>>>
>>>>> at
>>>>>
com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:178)
>>>>>
>>>>> at
>>>>>
org.apache.camel.builder.xml.XPathBuilder.evaluateAs(XPathBuilder.java:429)
>>>>>
>>>>>
>>>>
>>>>> ...
>>>>> Is there anything I need to configure in addidtion to
make it
>>>>> work?
>>>>> In
>>>>>
https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/util/
>>>>>
>>>>> there isn't a test for CxfHeaderHelper, so I'm stuck
... In
>>>>> the JIRA
>>>>> report I find "let people configure what should be copied
to/form
>>>>> native
>>>>> message", but not how to do it. Have I overseen something?
>>>>> Regards,
>>>>> Gisbert
>>>>> Willem Jiang schrieb:
>>>>>
>>>>>>>> Hi Gisbert
>>>>>>>>
>>>>>>>> It's my fault that I didn't check the camel-cxf component's
>>>>>>>> change log.
>>>>>>>> You can't use Message.PROTOCOL_HEADERS to get the
SOAPAction any
>>>>>>>> more ,
>>>>>>>> since William Tam contributed a header filter strategy[1] to
>>>>>>>> encapsulate
>>>>>>>> the context of PROTOCOL_HEADERS in Camel 1.5.
>>>>>>>> You can find the code of CXF header handling in the method
>>>>>>>> propagateCxfToCamel() of CxfHeaderHelper[2]
>>>>>>>> You should get the SOAPAction just by using the
"SOAPAction" as
>>>>>>>> the Key.
>>>>>>>>
>>>>>>>> [1] https://issues.apache.org/activemq/browse/CAMEL-766
>>>>>>>> [2]
>>>>>>>>
https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/util/CxfHeaderHelper.java
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>>
>>>>>>>> Willem
>>>>>>>> Gisbert Amm wrote:
>>>>>>>> Hi Willem,
>>>>>>>>
>>>>>>>> thank you for the quick reply. I'm afraid I don't really
>>>>>>>> understand what
>>>>>>>> you want to tell me. I can see that you've commented the
code in the
>>>>>>>> test that did more or less the same I did because this
>>>>>>>> information is
>>>>>>>> obviously no longer provided in CXF 2.1.2. <http://2.1.2.>
>>>>>>>>
>>>>>>>> However, what do you mean when you say I should use
>>>>>>>> SOAPActionExtractor
>>>>>>>> only for handling the request message? I thought that I
already
>>>>>>>> did so:
>>>>>>>>
>>>>>>>> <route>
>>>>>>>> <from uri="cxf:bean:MyEndpoint"/>
>>>>>>>> <process ref="sOAPActionExtractor"/>
>>>>>>>> ...
>>>>>>>>
>>>>>>>> And how can I retrieve the SOAP action from the message
now? My
>>>>>>>> routing
>>>>>>>> relies on it ...
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Gisbert Amm
>>>>>>>>
>>>>>>>> Willem Jiang wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> Camel-1.5 snapshot is using CXF 2.1.2 and CXF 2.1.2 only
>>>>>>>>>>> apply the
>>>>>>>>>>> SOAPAction for the request message (in
>>>>>>>>>>> SoapPreProtocolOutInterceptor).
>>>>>>>>>>> Please make sure the SOAPActionExtractor only be used for
>>>>>>>>>>> handling
>>>>>>>>>>> the
>>>>>>>>>>> request message :)
>>>>>>>>>>>
>>>>>>>>>>> You can find more information in the
CustomerServicesTest[1]
>>>>>>>>>>>
>>>>>>>>>>>
[1]https://svn.apache.org/repos/asf/activemq/camel/trunk/tests/camel-itest/src/test/java/org/apache/camel/itest/customerrelations/CustomerServicesTest.java
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Willem
>>>>>>>>>>>
>>>>>>>>>>> Gisbert Amm wrote:
>>>>>>>>>>> I've upgraded Camel to the current HEAD from SVN.
>>>>>>>>>>>
>>>>>>>>>>> Consider this code, which worked fine with version 1.4.0:
>>>>>>>>>>>
>>>>>>>>>>> public class SOAPActionExtractor implements Processor {
>>>>>>>>>>>
>>>>>>>>>>> public void process(Exchange exchange) throws Exception {
>>>>>>>>>>> Map header = (Map)
>>>>>>>>>>> exchange.getIn().getHeader(Message.PROTOCOL_HEADERS);
>>>>>>>>>>> ...
>>>>>>>>>>>
>>>>>>>>>>> (Message is of type org.apache.cxf.message.Message)
>>>>>>>>>>>
>>>>>>>>>>> After upgrading to 1.5-SNAPSHOT, the header is null and I
>>>>>>>>>>> therefore get
>>>>>>>>>>> a NPE later on. Can somebody explain why this happens
and what
>>>>>>>>>>> has
>>>>>>>>>>> changed here? That would be very helpful.
>>>>>>>>>>>
>>>>>>>>>>> Regards,
>>>>>>>>>>> Gisbert Amm
>>>>>>>>>>>
>>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFIyUdjwM6uO7ce7NoRAtdZAJwPD8ouEZmuxVQDO03qGWzNMoW7XQCfTqyv
Gcgc5Btw+DjrLLdJ5MwZy9E=
=wSc7
-----END PGP SIGNATURE-----