The cxfrs: component provides integration with Apache 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:
Where address represents the CXF endpoint's address
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:
The resource classes which you want to export as REST service. Multiple classes can be separated by comma.
resourceClasses The resource class which you want to export as REST service.
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
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.
New in 2.6, this option tells the CxfRsProducer to inspect return codes and will generate an Exception if the return code is larger than 207.
New in 2.6, you can set a IN message header CamelDestinationOverrideUrl to dynamically override the target destination Web Service or REST Service defined in your routes. The implementation caches CXF clients or ClientFactoryBean in CxfProvider and CxfRsProvider. This option allows you to configure the maximum size of the cache.
New in 2.9.0. Will set the default bus when CXF endpoint create a bus by itself
New in 2.9.0. A default bus created by CXF Bus Factory. Use
# notation to reference a bus object from the registry. The referenced object must be an instance of
As of 2.11. Sets how requests and responses will be mapped to/from Camel. Two values are possible:
SimpleConsumer => see the Consuming a REST Request with the Simple Binding Style below.
Default => the default style. For consumers this passes on a
MessageContentsList to the route, requiring low-level processing in the route.
- Custom => allows you to specify a custom binding through the
|binding||Allows you to specify a custom |
CxfRsBinding implementation to perform low-level processing of the raw CXF request and response objects. The implementation must be bound in the Camel registry, and you must use the hash (#) notation to refer to it.
Since Camel 2.12.2 set custom JAX-RS providers list to the CxfRs endpoint.
Since Camel 2.12.2 Sets the locations of the schemas which can be used to validate the incoming XML or JAXB-driven JSON.
Since Camel 2.12.3 Set the feature list to the CxfRs endpoint.
Since Camel 2.12.4 Set the properties to the CxfRs endpoint.
Since Camel 2.12.4 Set the inInterceptors to the CxfRs endpoint.
Since Camel 2.12.4 Set the outInterceptor to the CxfRs endpoint.
Since Camel 2.12.4 Set the inFaultInterceptors to the CxfRs endpoint.
Since Camel 2.12.4 Set the outFaultInterceptors to the CxfRs endpoint.
Since Camel 2.14.0 This option is used to set the CXF continuation timeout which could be used in CxfConsumer by default when the CXF server is using Jetty or Servlet transport. (Before Camel 2.14.0, CxfConsumer just set the continuation timeout to be 0, which means the continuation suspend operation never timeout.)
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 provide different configuration for them.
Please check out the schema file and CXF JAX-RS documentation for more information.
How to configure the REST endpoint in Camel
In camel-cxf schema file, there are two elements for the REST endpoint definition. cxf:rsServer for REST consumer, cxf:rsClient for REST producer.
You can find a Camel REST service route configuration example here.
Consuming a REST Request - Simple Binding Style
Available as of Camel 2.11
Default binding style is rather low-level, requiring the user to manually process the
MessageContentsList object coming into the route. Thus, it tightly couples the route logic with the method signature and parameter indices of the JAX-RS operation. Somewhat inelegant, difficult and error-prone.
In contrast, the
SimpleConsumer binding style performs the following mappings, in order to make the request data more accessible to you within the Camel Message:
- JAX-RS Parameters (@HeaderParam, @QueryParam, etc.) are injected as IN message headers. The header name matches the value of the annotation.
- The request entity (POJO or other type) becomes the IN message body. If a single entity cannot be identified in the JAX-RS method signature, it falls back to the original
@Multipart body parts become IN message attachments, supporting
DataSource and CXF's
@Multipart body parts are mapped as IN message headers. The header name matches the Body Part name.
Additionally, the following rules apply to the Response mapping:
- If the message body type is different to
javax.ws.rs.core.Response (user-built response), a new
Response is created and the message body is set as the entity (so long it's not null). The response status code is taken from the
Exchange.HTTP_RESPONSE_CODE header, or defaults to 200 OK if not present.
- If the message body type is equal to
javax.ws.rs.core.Response, it means that the user has built a custom response, and therefore it is respected and it becomes the final response.
- In all cases, Camel headers permitted by custom or default
HeaderFilterStrategy are added to the HTTP response.
Enabling the Simple Binding Style
This binding style can be activated by setting the
bindingStyle parameter in the consumer endpoint to value
Examples of request binding with different method signatures
Below is a list of method signatures along with the expected result from the Simple binding.
public Response doAction(BusinessObject request);
Request payload is placed in IN message body, replacing the original MessageContentsList.
public Response doAction(BusinessObject request, @HeaderParam("abcd") String abcd, @QueryParam("defg") String defg);
Request payload placed in IN message body, replacing the original MessageContentsList. Both request params mapped as IN message headers with names abcd and defg.
public Response doAction(@HeaderParam("abcd") String abcd, @QueryParam("defg") String defg);
Both request params mapped as IN message headers with names abcd and defg. The original MessageContentsList is preserved, even though it only contains the 2 parameters.
public Response doAction(@Multipart(value="body1") BusinessObject request, @Multipart(value="body2") BusinessObject request2);
The first parameter is transferred as a header with name body1, and the second one is mapped as header body2. The original MessageContentsList is preserved as the IN message body.
public Response doAction(InputStream abcd);
The InputStream is unwrapped from the MessageContentsList and preserved as the IN message body.
public Response doAction(DataHandler abcd);
The DataHandler is unwrapped from the MessageContentsList and preserved as the IN message body.
More examples of the Simple Binding Style
Given a JAX-RS resource class with this method:
Serviced by the following route:
The following HTTP request with XML payload (given that the Customer DTO is JAXB-annotated):
Will print the message:
For more examples on how to process requests and write responses can be found here.
Consuming a REST Request - Default Binding Style
The CXF JAXRS front end implements the JAX-RS (JSR-311) API, so we can export the resources classes as a REST service. And we leverage the CXF Invoker API to turn a REST request into a normal Java object method invocation.
Unlike the Camel Restlet component, you don't need to specify the URI template within your endpoint, CXF takes care of the REST request URI to resource class method mapping according to the JSR-311 specification. All you need to do in Camel is delegate this method request to a right processor or endpoint.
Here is an example of a CXFRS route...
And the corresponding resource class used to configure the endpoint...
How to invoke the REST service through camel-cxfrs producer
The CXF JAXRS front end implements a proxy-based client API, with this API you can invoke the remote REST service through a proxy. The
camel-cxfrs producer is based on this proxy API.
You just need to specify the operation name in the message header and prepare the parameter in the message body, the camel-cxfrs producer will generate right REST request for you.
Here is an example:
The CXF JAXRS front end also provides a http centric client API. You can also invoke this API from
camel-cxfrs producer. You need to specify the HTTP_PATH and the HTTP_METHOD and let the producer use the http centric client API by using the URI option httpClientAPI or by setting the message header CxfConstants.CAMEL_CXF_RS_USING_HTTP_API. You can turn the response object to the type class specified with the message header CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS.
From Camel 2.1, we also support to specify the query parameters from cxfrs URI for the CXFRS http centric client.
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.