|
Page Edited :
CXF20DOC :
JAX-RS (JSR-311)
JAX-RS (JSR-311) has been edited by Jervis Liu (Dec 20, 2007). Content:CXF has an initial implementation of JAX-RS (JSR-311): Java API for RESTfulWeb Services. JAX-RS provides a more standard way to build RESTful services in Java. A demo called restful_jaxrs can be found in CXF distribution (CXF 2.1 only). Understanding the basicsYou are encouraged to read JAX-RS spec Resource classA resource class is a Java Class annotated with JAX-RS annotations to represent a Web resource. A typical resource class in JAX-RS looks like below: package demo.jaxrs.server;import java.util.HashMap; import java.util.Map; import javax.ws.rs.HttpMethod; import javax.ws.rs.ProduceMime; import javax.ws.rs.UriParam; import javax.ws.rs.UriTemplate; import javax.ws.rs.core.HttpContext; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; @UriTemplate("/customerservice/") public class CustomerService { public CustomerService() { } @HttpMethod("GET") @UriTemplate("/customers/{id}/") public Customer getCustomer(@UriParam("id") String id) { ...... } @HttpMethod("PUT") @UriTemplate("/customers/") public Response updateCustomer(Customer customer) { ...... } @HttpMethod("POST") @UriTemplate("/customers/") public Response addCustomer(Customer customer) { ...... } @HttpMethod("DELETE") @UriTemplate("/customers/{id}/") public Response deleteCustomer(@UriParam("id") String id) { ...... } @UriTemplate("/orders/{orderId}/") public Order getOrder(@UriParam("orderId") String orderId) { ...... } } URI Templates@UriTemplate annotation can be applied to resource classes or methods. JAX-RS spec @HttpMethod@HttpMethod specifies the HTTP verb (GET, PUT, POST,DELETE) a method can accept. Sub-resource locators.A method of a resource class that is annotated with @UriTemplate becomes a sub-resource locator when @HttpMethod is not present. Sub-resource locators are used to further resolve the object that will handle the request. In the example below, getOrder method is a sub-resource locator: @UriTemplate("/customerservice/") public class CustomerService { @UriTemplate("/orders/{orderId}/") public Order getOrder(@UriParam("orderId") String orderId) { ...... } } @XmlRootElement(name = "Order") public class Order { private long id; private String description; public Order() { } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String d) { this.description = d; } @HttpMethod("GET") @UriTemplate("products/{productId}/") public Product getProduct(@UriParam("productId")int productId) { ...... } } A HTTP GET request to http://localhost:9000/customerservice/orders/223/products/323 Content type negotiationOne of the coolest thing of REST is that the same resource can be accessed using multiple Representations. @ProduceMime and @ConsumeMime annotations are used to declare the supported request and response media types. JAXB supportTo accept or return Objects that can be marshaled/unmarshaled using JAXB, the Objects need to be marked with @XmlRootElement annotation. For example: @XmlRootElement(name = "Customer") public class Customer { private String name; private long id; public Customer() { } public void setName(String n) { name = n; } public String getName() { return name; } public void setId(long i) { id = i; } public long getId() { return id; } } In the example below, the Customer object returned by getCustomer is marshaled using JAXB data binding: @UriTemplate("/customerservice/") public class CustomerService { @HttpMethod("GET") @UriTemplate("/customers/{customerId}/") public Customer getCustomer(@UriParam("customerId") String id) { .... } } The wire representation of Customer object is: @UriTemplate("/customerservice/")
<Customer>
<id>123</id>
<name>John</name>
</Customer>
To return or accept Object collections, you need to define an Object collection type. For example: @XmlRootElement(name = "Customers") public class Customers { private Collection<Customer> customers; public Collection<Customer> getCustomer() { return customers; } public void setCustomer(Collection<Customer> c) { this.customers = c; } } @UriTemplate("/customerservice/") public class CustomerService { @HttpMethod("GET") @UriTemplate("/customers/") public Customers getCustomers() { .... } } JSON supportFollowing code returns a Customer Object that is marshaled to JSON format: @UriTemplate("/customerservice/") public class CustomerService { @ProduceMime("application/json") @HttpMethod("GET") @UriTemplate("/customers/{customerId}/") public Customer getCustomer(@UriParam("customerId") String id) { .... } The wire representation of Customer object is: {"Customer ":{"id":"123","name":"john"}}
{code:java}
h3. DOMSource support
{code:java}
@UriTemplate("/bookstore/")
public class BookStore {
@HttpMethod("GET")
@UriTemplate("/customers/{customerId}/")
public javax.xml.transform.dom.DOMSource getCustomer(@UriParam("customerId") String id) {
....
}
}
Configuring JAX-RS servicesConfiguring JAX-RS services programmaticallyYou can create a JAX-RS RESTful service by using JAXRSServerFactoryBean: JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); sf.setResourceClasses(CustomerService.class); sf.setAddress("http://localhost:9000/"); sf.create(); A couple things to note:
Configuring JAX-RS services in container with Spring configuration file.web.xml<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXF Servlet</display-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> beans.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <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-servlet.xml" /> <jaxrs:server id="customerService" address="/"> <jaxrs:serviceBeans> <bean class="demo.jaxrs.server.CustomerService" /> </jaxrs:serviceBeans> </jaxrs:server> </beans> |
Unsubscribe or edit your notifications preferences
