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>
<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());
assertEquals(200, response.getStatusLine().
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...