Contenido


Servicios web de Java

Introducción a CXF

Conozca otro marco de servicios web de Apache Software Foundation

Comments

Contenido de la serie:

Este contenido es la parte # de # de la serie: Servicios web de Java

Manténgase en contacto por contenidos adicionales de esta serie.

Este contenido es parte de la serie:Servicios web de Java

Manténgase en contacto por contenidos adicionales de esta serie.

CXF es otra pila de servicios web de Apache Software Foundation, el mismo grupo que desarrolló la pila Axis2. Si bien pertenecen a la misma fundación, Axis 2 y CXF tienen enfoques muy diferentes en cuanto a la forma de configurar y entregar servicios web. En este artículo, se analizarán los fundamentos del uso de JAXB 2.x y JAX-WS 2.x para servicios web con CXF y se establecerá una comparación entre CXF y las otras pilas para JAXB/JAX-WS — Axis2 y Metro —, que se analizaron en los artículos anteriores.

Comparación básica de CXF

En cuanto a la interfaz de usuario, CXF tiene mucho en común con las pilas de servicios web Axis2 y Metro. Las tres pilas permiten iniciar a partir de un código Java™ existente y generar un servicio web o bien iniciar a partir de una descripción de servicios web WSDL y generar código Java para usar o implementar el servicio. Al igual que las otras pilas, CXF modela operaciones de servicio como llamadas de método y tipos de puertos de servicio como interfaces.

Al igual que Axis2, pero a diferencia de Metro, CXF lo ayuda a elegir entre diferentes tecnologías de enlace de datos. El soporte que da CXF respecto del enlace de datos JAXB 2.x está al mismo nivel que el de Metro y a un nivel superior que el de Axis2, ya que permite usar personalizaciones JAXB cuando se genera código a partir de WSDL (a diferencia de Axis2). Además, CXF permite usar otros enfoques de enlace de datos, si bien el soporte para esos enfoques no está tan desarrollado como en Axis2 — particularmente, solo es posible generar código a partir de WSDL con CXF si se usa un enlace de datos JAXB o XMLBeans.

La técnica de configuración de servicio preferida (o frontend, según la terminología de CXF) para usar con CXF son las anotaciones JAX-WS 2.x, generalmente complementadas por archivos de configuración XML. El soporte de CXF para las anotaciones JAX-WS está al mismo nivel que el de Metro y es mucho más adecuado para el uso de JAX-WS que el soporte de Axis2 (que tiene grandes limitaciones para usar JAX-WS, como se analizó en "JAXB and JAX-WS in Axis2"). Como sucede con otras implementaciones JAX-WS, CXF requiere que el servicio WSDL se encuentre disponible para el cliente en el tiempo de ejecución.

Al igual que las demás pilas, CXF usa flujos de procesamiento de solicitudes y respuestas formados por componentes configurables. CXF denomina estos componentes interceptores, en lugar de controladores, pero, dejando de lado la terminología, los componentes son equivalentes. Al igual que Metro, CXF trae soporte para WS-Security y otras tecnologías de extensión en la descarga básica. Pero, a diferencia de Metro, los archivos JAR de CXF son modulares, lo que significa que usted podrá elegir los archivos JAR que desee incluir en su aplicación en función de las tecnologías usadas (el archivo /lib/WHICH_JARS de la instalación de CXF le informa los archivos JAR específicos que se necesitan para diversos casos de uso habituales). La desventaja de esta modularidad es que la lista de archivos JAR específicos necesarios puede llegar a ser muy extensa; la ventaja, que permite contener el tamaño de su implementación evitando su ampliación.

De la misma manera que Metro, generalmente CXF requiere que el usuario genere un archivo WAR para el servicio web en lugar de implementar muchos servicios en una instalación de un solo servidor (como ocurre con Axis2). Además, CXF proporciona un servidor HTTP integrado apto para su uso en producción: el servidor Jetty. Esto representa una alternativa más flexible y eficaz que el soporte simple del servidor HTTP integrado en Axis2 y en Metro.

Aplicación de muestra

La descarga del código proporciona una versión del servicio de administración de biblioteca usado en los artículos anteriores de la serie, modificado para demostrar el uso de CXF. Como en las versiones anteriores, la definición del servicio WSDL define cuatro operaciones:

  • getBook recupera los detalles de un libro específico identificado con un número ISBN.
  • getBooksByType recupera los detalles de todos los libros de un tipo específico.
  • getTypes busca los tipos de libros disponibles.
  • addBook agrega un nuevo libro a la biblioteca.

En "JAXB and JAX-WS in Axis2", se pudo observar el funcionamiento de esta aplicación en Axis2 y, en "Introducing Metro," se observó el funcionamiento en Metro. La mayor parte del análisis de los artículos anteriores también se aplica al uso de CXF. El WSDL es idéntico exceptuando el nombre y la dirección de extremo del servicio; el modelo de datos JAXB generado es el mismo e incluso las clases de servicios generados son idénticas con excepción del paquete de Java y del nombre de servicio usados en las anotaciones JAX-WS.

Uso del lado cliente

El código del lado cliente de la aplicación de muestra en CXF equivale al uso de JAX-WS con Axis2 o Metro, y los pasos de generación son similares: simplemente use la herramienta wsdl2java de CXF en lugar de la herramienta wsimport de la implementación de referencia JAX-WS. Ver "JAXB and JAX-WS in Axis2" para obtener información sobre el código y el manejo.

Si bien el código del cliente es el mismo, existe una diferencia significativa en el comportamiento del cliente en CXF. De manera predeterminada, CXF imprime una insoportable cantidad de datos de registro en la consola. Como CXF usa Java Logging, para evitar estos datos de salida, es necesario establecer una propiedad del sistema que señale un archivo de propiedades de registro con la configuración cambiada de manera de producir solamente información WARNING o SEVERE. Esto se puede hacer con el archivo de Ant build.xml de la aplicación de muestra, usando la línea de parámetros de la JVM <jvmarg value="-Djava.util.logging.config.file=${build-dir}/logging.properties"/>.

Uso del lado servidor

El código del lado servidor de la aplicación de muestra en CXF también equivale al uso de JAX-WS con Axis2 o Metro, y el proceso de generación es muy similar al de Metro. Con Axis2, prepare el servicio para su implementación creando un archivo JAR que contenga las clases de servicios y de modelos de datos y luego implemente el servicio colocando ese archivo JAR en el directorio WEB-INF/servicejars en una instalación de servidor Axis2. En cambio, con Metro y CXF, es necesario crear un archivo WAR que contenga las clases de servicios y de modelos de datos, los archivos JAR de la biblioteca Metro o CXF y un par de archivos de configuración (el nombre de uno ellos varía según la pila en cuestión). El archivo WEB-INF/web.xml configura el manejo actual del servlet actual. La versión usada en la aplicación de muestra se puede ver en ellistado 1:

Listado 1. Archivo web.xml de la aplicación de muestra
<web-app
version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<display-name>CXFLibrary</display-name>
<description>CXF Library Service</description>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath:META-INF/cxf/cxf.xml
classpath:META-INF/cxf/cxf-extension-soap.xml classpath:META-INF/cxf/cxf-servlet.xml
</param-value> </context-param> <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>/*</url-pattern>
</servlet-mapping> </web-app>

El archivo WEB-INF/web.xml del listado 1 es simplemente un archivo de configuración de servlet estándar que le informa al servidor de aplicaciones Web (p. ej., Tomcat) cómo crear una interfaz con la aplicación del servlet. Los detalles son similares a los del ejemplo de Metro, aunque en CXF <servlet-class> es parte del código CXF y <listener-class> hace referencia a la clase Spring Framework (ver Recursos). Al igual que en el ejemplo de Metro, el servlet está configurado para procesar todas las solicitudes que llegan a esta aplicación Web (por la entrada <url-pattern>/</url-pattern>).

Existe un archivo separado, WEB-INF/cxf-servlet.xml, que se usa para configurar CXF de manera de enrutar las solicitudes recibidas por el servlet al código de la implementación del servicio y de prestar el servicio WSDL a pedido del usuario. Este archivo se puede ver en el listado 2:

Listado 2. Archivo cxf-servlet.xml de la aplicación de muestra
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint id="Processor"
implementor="com.sosnoski.ws.library.cxf.CXFLibraryImpl"
wsdlLocation="WEB-INF/wsdl/library.wsdl" address="/">
</jaxws:endpoint> </beans>

El archivo WEB-INF/cxf-servlet.xml del listado 2 define un único extremo con una clase de implementación, el patrón con que se debe coincidir para las solicitudes y una ubicación del documento WSDL. La ubicación del documento WSDL es la única parte opcional de esta definición de extremo. Si no se especifica un WSDL para un extremo de servicio en el archivo cxf-servlet.xml file, CXF genera uno de manera automática en el tiempo de ejecución sobre la base de las anotaciones JAX-WS.

Generación y ejecución del código de muestra

Antes de probar el código de muestra, es necesario descargar e instalar una versión actual de CXF en el sistema (ver Recursos). El código de muestra se probó con la versión 2.2.5. También se requiere editar el archivo build.properties del directorio raíz de la descarga del código de muestra descomprimida para cambiar el valor de la propiedad cxf-home a la ruta de acceso de la instalación CXF. Si la prueba se realiza con un servidor en un sistema o puerto diferente, es posible que tenga que cambiar el host-name y el host-port.

Para generar la aplicación de muestra usando el archivo de Ant build.xml suministrado, abra una consola en el directorio raíz del código de descarga y escriba ant. En primer lugar, se invocará la herramienta wsdl2java de CXF (incluida en la distribución CXF), después se compilará el cliente y el servidor y, por último, se empaquetará el código de servidor como un archivo WAR. Implemente el archivo cxf-library.war generado en el servidor de prueba y escriba ant run en la consola para probar la ejecución del cliente de muestra. El cliente de muestra se ejecuta a lo largo de una secuencia de varios servidores, imprimiendo breves resultados para cada solicitud. Como se mencionó en Uso del lado cliente, la generación configura el registro de CXF de manera de evitar la impresión de los detalles de configuración cuando se ejecuta el cliente de muestra.

Spring en CXF

Observe el uso de las configuraciones bean de Spring Framework en el archivo de configuración cxf-servlet.xml del listado 2. Como ya sabrá, Spring es un marco de aplicaciones de código abierto con numerosas bibliotecas de componentes que se pueden usar para ensamblar las aplicaciones. El contenedor Inversion of Control (IoC) es la base original de Spring Framework. Permite vincular y configurar componentes de software del estilo JavaBean, usando la reflexión Java para acceder a las propiedades de los objetos bean en tiempo de ejecución.

Por lo general, el contenedor IoC de Spring usa archivos XML para la información de dependencia; el archivo cxf-servlet.xml del listado 2 es un ejemplo de esa configuración Spring. El elemento <beans> es un contenedor de configuraciones bean individuales. El elemento <jaxws:endpoint> uno de estos beans que CXF asocia con un tipo específico de objeto (una instancia org.apache.cxf.jaxws.EndpointImpl).

Es posible especificar en el archivo cxf-servlet.xml muchas más opciones que las usadas en este simple ejemplo, como la configuración de flujos de mensajes de un servicio. Para obtener más detalles, consulte la información de configuración de JAX-WS en la documentación de CXF (en Frontends/JAX-WS).

Aparte de las anotaciones JAX-WS, Spring se usa para toda la configuración de la pila CXF, incluida la organización de los flujos de mensajes interna de CXF. En la mayoría de los casos, estos detalles de configuración se controlan de forma automática mediante archivos de configuración XML incluidos directamente en los archivos JAR de CXF (en el valor de parámetro contextConfigLocation del archivo web.xml del listado 1podrá observar cómo se hace referencia a ellos), pero es posible efectuar una anulación o una agregación en los flujos comunes usando archivos de configuración propios. Este tema no será tratado de manera directa en la presente serie de artículos; para obtener más detalles, consulte la documentación de CXF.

Más CXF por delante

En este artículo, se analizaron los fundamentos del uso del enlace de datos JAXB 2.x y de la configuración basada en anotaciones de JAX-WS 2.x con la pila de servicios web CXF. El mismo código JAXB/JAX-WS que se usó en artículos anteriores con las pilas Axis2 y Metro funciona en CXF, después de ciertos cambios menores en la generación y con un archivo de configuración de instalación diferente. Esta compatibilidad entre diferentes pilas es el mayor beneficio de usar JAXB y JAX-WS, ya que facilita el intercambio de pilas.

CXF abarca mucho más de lo que muestra este simple ejemplo, y en futuros artículos se analizarán algunas de las restantes características. En el próximo artículo, se tratará del uso de WS-Security y se hará una comparación entre la implementación CXF y Axis2 y Metro.


Recursos para Descargar


Temas relacionados


Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java, SOA y servicios web
ArticleID=482003
ArticleTitle=Servicios web de Java: Introducción a CXF
publish-date=08052011