RESTful Web Services en Java con JAX-RS, Apache CXF y Spring


JAX-RS es una API Java para la implementación de RESTful Web Services. Apache CXF es una librería que implementa los estándares JAX-RS 2.0 (JSR-339) y JAX-RS 1.1 (JSR-311) y nos facilita la creación de Web Services. Además Apache CXF se integra perfectamente con Spring Framework.

Crearemos un simple servicio que expondrá un método que nos permitirá buscar libros por su ISBN y lo consumiremos desde una página web utilizando jQuery.
Pueden encontrar el código fuente del artículo en https://github.com/desatg/examples/tree/master/rest-sample

Veamos algunas de las partes más importantes de la aplicación.

En el archivo web.xml deberemos agregar el servlet de Apache CXF para que capture los pedidos a ciertas URIs y la convierta a invocaciones de métodos del Web Service:

  <servlet>  
  <servlet-name>CXFServlet</servlet-name>  
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  </servlet>  
  <servlet-mapping>  
  <servlet-name>CXFServlet</servlet-name>  
  <url-pattern>/api/*</url-pattern>  
  </servlet-mapping>  

Nuestro servicio estará implementado en la clase BookServiceBean.java y expondremos el siguiente método utilizando anotaciones estándar de JAX-RS:

 @Path("/book")  
 public class BookServiceBean implements BookService {  
      @GET  
      @Path("/{isbn}")  
      @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })  
      @Override  
      public Book get(@PathParam("isbn") String isbn) {  
           if ("0321356683".equals(isbn)) {  
                Book book = new Book();  
                book.setIsbn(isbn);  
                book.setTitle("Effective Java (2nd Edition)");  
                book.setPrice(new BigDecimal("38.13"));  
                return book;  
           }  
           return null;  
      }  
 }  

Apache CXF se encargará de serializar el objeto Book en una cadena JSON o XML utilizando los providers que especifiquemos. En este caso utilizaremos las librerías jackson-jaxrs-xml-provider (https://github.com/FasterXML/jackson-jaxrs-xml-provider) y jackson-jaxrs-json-provider (https://github.com/FasterXML/jackson-jaxrs-json-provider).

Finalmente crearemos el archivo ws-appctx.xml donde declaramos los beans de Spring y la configuración del Web Service con Apache CXF.
Usamos el elemento jaxrs:server para crear un contenedor REST:

 <beans xmlns:cxf="http://cxf.apache.org/core" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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  
   http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">  
   <import resource="classpath:META-INF/cxf/cxf.xml">  
      <bean class="org.topgroup.restsample.service.BookServiceBean" id="bookServiceV1"></bean>  
      <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider" id="jacksonJsonProvider">  
      <bean class="com.fasterxml.jackson.jaxrs.xml.JacksonJaxbXMLProvider" id="jacksonXmlProvider">  
   <jaxrs:server address="/rest/v1" id="restV1">  
     <jaxrs:servicebeans>  
       <ref bean="bookServiceV1">  
     </ref></jaxrs:servicebeans>  
     <jaxrs:providers>  
                <ref bean="jacksonJsonProvider">  
                <ref bean="jacksonXmlProvider">  
           </ref></ref></jaxrs:providers>  
     <jaxrs:extensionmappings>  
       <entry key="xml" value="application/xml">  
       <entry key="json" value="application/json">  
     </entry></entry></jaxrs:extensionmappings>  
   </jaxrs:server>  
 </bean></bean></import></beans>  

Si desean probar la aplicación, construyan el proyecto con Maven y luego lo deployan el war en un Tomcat e ingresan en http://localhost:8080/rest-sample

No hay comentarios:

Publicar un comentario en la entrada