Apache CXF y REST (Configuración)

En este post vamos a configurar Apache CXF para que sea capaz de publicar un servicio web REST . Para ello necesitaremos realizar varias operaciones . En primer lugar modificar el fichero web.xml para añadir el servlet de Apache CXF y los listener de Spring .Ya que recordemos Apache CXF se apoya de manera fuerte en este framework.

A continuación se muestra el contenido de este fichero


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

<servlet>
 <servlet-name>CXFServlet</servlet-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>/rest/*</url-pattern>
 </servlet-mapping>
</web-app>

Una vez tenemos configurado el fichero web.xml necesitaremos configurar también las dependencias en este caso nos apoyaremos en Maven y en un fichero pom.xml.

Vamos a ver el contenido a nivel de dependencias del fichero POM.


<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>3.2.2.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>3.2.2.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>3.2.2.RELEASE</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-frontend-jaxws</artifactId>

<version>2.7.4</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-transports-http</artifactId>

<version>2.7.4</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-frontend-jaxrs</artifactId>

<version>2.7.4</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-rs-extension-providers</artifactId>

<version>2.6.0</version>

</dependency>

<dependency>

<groupId>javax.xml.bind</groupId>

<artifactId>jaxb-api</artifactId>

<version>2.2.9</version>

</dependency>

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-jaxrs</artifactId>

<version>1.9.0</version>

</dependency>

</dependencies>

Realizadas estas operaciones nos queda configurar el fichero de Spring para que pueda funcionar con servicios REST sin problemas

El contenido del fichero de applicationContext.xml será el siguiente


<?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-servlet.xml" />
<jaxrs:server id="servicioRest" address="/">
 <jaxrs:serviceBeans>
 <bean class="com.arquitecturajava.serviciosexternos.ServicioPersonas" />
 </jaxrs:serviceBeans>
 <jaxrs:providers>
 <ref bean="jsonProvider"/>
 </jaxrs:providers>
 <jaxrs:features>
 </jaxrs:features>
 </jaxrs:server>
 <bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
</beans>

Como podemos ver en un primer lugar aparecen las etiquetas <import> que se encargan de dar de alta los ficheros de configuración de Apache CXF.

&amp;amp;lt;import resource="classpath:META-INF/cxf/cxf.xml" /&amp;amp;gt;
&amp;amp;lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&amp;amp;gt;

Una vez tenemos esto dado de alta añadimos un servidor de JAXRS  y el bean que deseamos gestionar a traves de él.

&amp;amp;lt;jaxrs:server id="servicioRest" address="/"&amp;amp;gt;
 &amp;amp;lt;jaxrs:serviceBeans&amp;amp;gt;
&amp;amp;lt;bean class="com.arquitecturajava.serviciosexternos.ServicioPersonas"/&amp;amp;gt;
 &amp;amp;lt;/jaxrs:serviceBeans&amp;amp;gt;
 &amp;amp;lt;jaxrs:providers&amp;amp;gt;
 &amp;amp;lt;ref bean="jsonProvider"/&amp;amp;gt;
 &amp;amp;lt;/jaxrs:providers&amp;amp;gt;
 &amp;amp;lt;jaxrs:features&amp;amp;gt;
 &amp;amp;lt;/jaxrs:features&amp;amp;gt;
 &amp;amp;lt;/jaxrs:server&amp;amp;gt;

Por último añadimos un proveedor de JSON para que sea capaz de transformar una lista de personas a una estructura JSON sin problemas

&amp;amp;lt;bean id="jsonProvider"
class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /&amp;amp;gt;
&amp;amp;lt;/beans&amp;amp;gt;

Realizados estos cambios tenemos Apache CXF configurado y podremos realizar las invocaciones REST necesarias.