Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
h2. CXFRS Component

The *cxfrs:* component provides integration with [Apache CXF|http://incubator.apache.org/cxf/] for connecting to JAX-RS services hosted in CXF.

Maven users will need to add the following dependency to their pom.xml for this component:
{code:xml}
<dependency>
   <groupId>org.apache.camel</groupId>
   <artifactId>camel-cxf</artifactId>
   <version>x.x.x</version>  <!-- use the same version as your Camel core version -->
</dependency>
{code}

h3. URI format

{code}
cxfrs://address?options
{code}
Where *address* represents the CXF endpoint's address
{code}
cxfrs:bean:rsEndpoint
{code}
Where *rsEndpoint* represents the spring bean's name which presents the CXFRS client or server

For either style above, you can append options to the URI as follows:
{code}
cxfrs:bean:cxfEndpoint?resourceClass=org.apache.camel.rs.Example
{code}

h3. Options
{div:class=confluenceTableSmall}
|| Name || Description || Example || Required? || default value ||
| {{resourceClasses}} | The resource classes which you want to export as REST service | {{resourceClasses =org.apache.camel.rs.Example1,org.apache.camel.rs.Exchange2}} | No | _None_ |
| {{httpClientAPI}} | *new to Camel 2.1* If it is true, the CxfRsProducer will use the HttpClientAPI to invoke the service 
If it is false, the CxfRsProducer will use the ProxyClientAPI to invoke the service| httpClientAPI=true  |No | _true_ |
|synchronous| New in 2.5, this option will let CxfRsConsumer decide to use sync or async API to do the underlying work. The default value is false which means it will try to use async API by default.| synchronous=true| No | false| 
{div}

You can also configure the CXF REST endpoint through the spring configuration. Since there are lots of difference between the CXF REST client and CXF REST Server, we provides different configuration for them.
Please check out the [schema file|http://svn.apache.org/repos/asf/camel/trunk/components/camel-cxf/src/main/resources/schema/cxfEndpoint.xsd] and [CXF REST user guide|http://cwiki.apache.org/CXF20DOC/jax-rs.html] for more information.

h3. How to configure the REST endpoint in Camel
In [camel-cxf schema file|http://svn.apache.org/repos/asf/camel/trunk/components/camel-cxf/src/main/resources/schema/cxfEndpoint.xsd], there are two elements for the REST endpoint definition. *cxf:rsServer* for REST consumer, *cxf:rsClient* for REST producer.
You can find an camel REST service route configuration example here.

{snippet:id=cxfRsExample|lang=xml|url=camel/trunk/components/camel-cxf/src/test/resources/org/apache/camel/component/cxf/jaxrs/CxfRsSpringRouter.xml}


h3. How to consumer the REST request in Camel
[CXF JAXRS front end|http://cwiki.apache.org/CXF20DOC/jax-rs.html] implements the [JAXRS(JSR311) API|https://jsr311.dev.java.net/], so we can export the resources classes as a REST service. And we leverage the [CXF Invoker API|http://cwiki.apache.org/confluence/display/CXF20DOC/Invokers] to turn a REST request into a normal Java object method invocation.
Unlike the {{camel-restlet}}, you don't need to specify the URI template within your restlet endpoint, CXF take care of the REST request URI to resource class method mapping according to the JSR311 specification. All you need to do in Camel is delegate this method request to a right processor or endpoint.

Here is an example
{snippet:id=example|lang=java|url=camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsConsumerTest.java}
 

h3. How to invoke the REST service through camel-cxfrs producer
[CXF JAXRS front end|http://cwiki.apache.org/CXF20DOC/jax-rs.html] implements [a proxy based client API|http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-ProxybasedAPI], with this API you can invoke the remote REST service through a proxy. 
{{camel-cxfrs}} producer is based on this [proxy API|http://cwiki.apache.org/CXF20DOC/jax-rs.html#JAX-RS-ProxybasedAPI]. 
So, you just need to specify the operation name in the message header and prepare the parameter in the message body, camel-cxfrs producer will generate right REST request for you.

Here is an example
{snippet:id=ProxyExample|lang=java|url=camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java} 

[CXF JAXRS front end|http://cwiki.apache.org/CXF20DOC/jax-rs.html] also provides [a http centric client API|http://cxf.apache.org/docs/jax-rs.html#JAX-RS-HTTPcentricclients], You can also invoke this API from {{camel-cxfrs}} producer. You need to specify the HTTP_PATH and Http method and let the the producer know to use the http centric client by using the URI option *httpClientAPI* or set the message header with CxfConstants.CAMEL_CXF_RS_USING_HTTP_API. You can turn the response object to the type class that you specify with CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS.

{snippet:id=HttpExample|lang=java|url=camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java} 

From Camel 2.1, we also support to specify the query parameters from cxfrs URI for the CXFRS http centric client.
{snippet:id=QueryExample|lang=java|url=camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java} 
To support the Dynamical routing, you can override the URI's query parameters by using the CxfConstants.CAMEL_CXF_RS_QUERY_MAP header to set the parameter map for it.To support the Dynamical routing, you can override the URI's query parameters by using the CxfConstants.CAMEL_CXF_RS_QUERY_MAP header to set the parameter map for it.
{snippet:id=QueryMapExample|lang=java|url=camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java}