Basic REST service in Apache CXF vs. Camel-CXF
Join the DZone community and get the full member experience.
Join For FreeThis article demonstrates how to create/test a basic REST service in CXF
vs. Camel-CXF. Given the range of configuration and deployment options,
I'm focusing on building a basic OSGi bundle that can be deployed in
Fuse 4.2 (ServiceMix)...basic knowledge of Maven, ServiceMix and Camel
are assumed.
Apache CXF
For more details, see http://cxf.apache.org/docs/jax-rs.html.
Here is an overview of the steps to get a basic example running...
1. add dependencies to your pom.xml
2. setup the bundle-context.xml file
3. create a service bean class
4. deploy and test
Camel-CXF
For details, see http://camel.apache.org/cxfrs.html.
Here is an overview of the steps to get a basic example running...
1. add dependencies to your pom.xml
2. setup the bundle-context.xml file
3. create a RouteBuilder class
4. create a REST Resource class
5. deploy and test
Unit Testing
To perform basic unit testing for either of these approaches, use the Apache HttpClient APIs by first adding this dependency to your pom.xml...
Summary
Overall, the approaches are very similar, but you can use various combinations of Spring XML and Java APIs to set this up. I focused on a common approach to demonstrate the basics of each approach side-by-side.
That being said, if you have requirements for complex REST services (security, interceptors, filters, etc), I recommend grabbing a copy of Apache CXF Web Service Development and following some of the more complex examples on the Apache CXF, Camel-CXFRS pages.
In practice, I've generally used Camel-CXF because it gives you the flexibility of integrating with other Camel components and allows you to leverage the rich routing features of Camel. I hope to cover more complex scenarios in future posts...
Apache CXF
For more details, see http://cxf.apache.org/docs/jax-rs.html.
Here is an overview of the steps to get a basic example running...
1. add dependencies to your pom.xml
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>2.3.0</version> </dependency>
2. setup the bundle-context.xml file
<import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" /> <bean id="exampleBean" class="com.example.ExampleBean" /> <jaxrs:server id="exampleService" address="http://localhost:9000/"> <jaxrs:serviceBeans> <ref bean="exampleBean" /> </jaxrs:serviceBeans> </jaxrs:server>
3. create a service bean class
@Path("/example") public class ExampleBean { @GET @Path("/") public String ping() throws Exception { return "SUCCESS"; } }
4. deploy and test
build the bundle using "mvn install" start servicemix deploy the bundle open a browser to "http://localhost:9000/example" (should see "SUCCESS")
Camel-CXF
For details, see http://camel.apache.org/cxfrs.html.
Here is an overview of the steps to get a basic example running...
1. add dependencies to your pom.xml
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>${camel.version}</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf</artifactId> <version>${camel.version}</version> </dependency>
2. setup the bundle-context.xml file
<camelContext trace="true" id="camelContext" xmlns="http://camel.apache.org/schema/spring"> <package>com.example</package> </camelContext>
3. create a RouteBuilder class
public class ExampleRouter extends RouteBuilder { @Override public void configure() throws Exception { from("cxfrs://http://localhost:9000?resourceClasses=" + ExampleResource.class.getName()) .process(new Processor() { public void process(Exchange exchange) throws Exception { //custom processing here } }) .setBody(constant("SUCCESS")); } }
4. create a REST Resource class
@Path("/example") public class ExampleResource { @GET public void ping() { //strangely, this method is not called, only serves to configure the endpoint } }
5. deploy and test
build bundle using "mvn install" start servicemix deploy the bundle open a browser to "http://localhost:9000/example" (should see "SUCCESS")
Unit Testing
To perform basic unit testing for either of these approaches, use the Apache HttpClient APIs by first adding this dependency to your pom.xml...
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.0.1</version> </dependency>Then, you can use these APIs to create a basic test to validate the REST services created above...
String url = "http://localhost:9000/example"; HttpGet httpGet = new HttpGet(url); HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = httpclient.execute(httpGet); String responseMessage = EntityUtils.toString(response.getEntity()); assertEquals("SUCCESS", responseMessage); assertEquals(200, response.getStatusLine().getStatusCode());
Summary
Overall, the approaches are very similar, but you can use various combinations of Spring XML and Java APIs to set this up. I focused on a common approach to demonstrate the basics of each approach side-by-side.
That being said, if you have requirements for complex REST services (security, interceptors, filters, etc), I recommend grabbing a copy of Apache CXF Web Service Development and following some of the more complex examples on the Apache CXF, Camel-CXFRS pages.
In practice, I've generally used Camel-CXF because it gives you the flexibility of integrating with other Camel components and allows you to leverage the rich routing features of Camel. I hope to cover more complex scenarios in future posts...
REST
Web Protocols
Apache CXF
Web Service
Published at DZone with permission of Ben O'Day, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments