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;lt;import resource="classpath:META-INF/cxf/cxf.xml" /&amp;gt; &amp;lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&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;lt;jaxrs:server id="servicioRest" address="/"&amp;gt; &amp;lt;jaxrs:serviceBeans&amp;gt; &amp;lt;bean class="com.arquitecturajava.serviciosexternos.ServicioPersonas"/&amp;gt; &amp;lt;/jaxrs:serviceBeans&amp;gt; &amp;lt;jaxrs:providers&amp;gt; &amp;lt;ref bean="jsonProvider"/&amp;gt; &amp;lt;/jaxrs:providers&amp;gt; &amp;lt;jaxrs:features&amp;gt; &amp;lt;/jaxrs:features&amp;gt; &amp;lt;/jaxrs:server&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;lt;bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /&amp;gt; &amp;lt;/beans&amp;gt;
Realizados estos cambios tenemos Apache CXF configurado y podremos realizar las invocaciones REST necesarias.
Hola amigo, como puedo habilitar Cors?
Hola.
Otra duda que tengo. Cuando hablamos de “maping” en java. A qué nos referimos exactamente ? “mapeo” de tablas con el uso de ORMs ? archivos de configuración (los managedbeans cuando se usa jsf por ejemplo)? paths en URLs ?
Dónde es correcto usarlo y dónde no ?
Saludos.
Hola.
Tienes un artículo donde se hable de la estructura básica (de carpetas) de una aplicación web de java ? donde se explique qué archivos de configuración deberían ir en cada carpeta del proyecto ?
Es que no he encontrado un artículo todavía en la web donde pueda obtener una buena idea de ello.
Saludos.
No no tengo nada de estos temas 🙁
[…] Apache CXF y configurarlo en un Tomcat7 . Se puede ver como configurarlo en el siguiente artículo Apache CXF Configuración. Una vez configurado vamos a dar de alta el […]
Una pregunta, en el servicio se pueden usar las anotaciones de jax-rs?
Como sería la clase ServicioPersonas? y como la invocación http?
Gracias y saludos
No deberias tener problema deberias mapear entonces la propia clase de servicio 🙂