Servicios web de Java: Introducción a CXF

Conozca otro marco de servicios web de Apache Software Foundation

La pila de servicios web Apache CXF soporta el enlace de datos JAXB 2.x (además de algunos enlaces de datos alternativos) y la configuración de servicio JAX-WS 2.x. Al igual que la alternativa JAXB/JAX-WS de Metro que se analizó en columnas anteriores, CXF usa archivos XML para extender la información de la configuración JAX-WS. En este artículo, Dennis Sosnoski, el autor de la serie servicios web de Java estudia los fundamentos del trabajo con CXF para el desarrollo del cliente y del servidor.

Dennis Sosnoski, Architecture Consultant and Trainer, Sosnoski Software Solutions, Inc.

Author photoDennis Sosnoski es un consultor y entrenador especializado en servicios web y XML basados en Java. Su experiencia en el desarrollo de software profesional abarca más de 30 años, con los últimos 10 enfocados a tecnologías XML y Java ejecutadas en el servidor. Dennis es el desarrollador principal de la infraestructura JiBX XML Data Binding de fuente abierta y de la infraestructura de servicios web JiBX/WS asociada, así como también un delegado en la infraestructura de servicio web Apache Axis2. También fue uno de los miembros de Grupo Experto para las especificaciones KAX-WS 2.0 y JAXB 2.0. El material para la serie de servicios web de Java está basado en las clases de capacitación de Dennis.



05-08-2011

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.

Acerca de esta serie

Los servicios web son una parte fundamental del rol de la tecnología Java en la computación empresarial. En esta serie de artículos, el consultor de servicios web y XML Dennis Sosnoski trata de los marcos y tecnologías más importantes para los desarrolladores de Java que usan servicios web. Siga de cerca la serie para mantenerse informado acerca de las últimas novedades del campo y de la manera de usarlas para mejorar sus proyectos de programación.

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

Problemas de agrupamiento

A partir de Java SE 6, los tiempos de ejecución de las implementaciones de referencia JAXB 2.x y JAX-WS 2.x (con excepción de las extensiones del proveedor) pasaron a formar parte de las bibliotecas de Java Runtime Environment (JRE) estándar. De esta manera se intentaba promover el uso de estas tecnologías como estándares Java; sin embargo, se produjo un efecto secundario no deseado: ahora puede ser necesario hacer un cambio en la instalación JRE para usar las versiones más nuevas de estas tecnologías.

El archivo build.xml usado en la descarga de la aplicación de muestra copia los archivos JAR de CXF requeridos directamente en el archivo WAR del servicio. Aquí se incluyen los archivos JAR de JAXB y JAX-WS de generación con Java SE 5; sin embargo, cuando se genera con Java SE 6, la generación se basa en las versiones de JAXB y JAX-WS incluidas en la instalación de la JVM. Si los conflictos de carga de clases generan problemas dentro del código JAXB o JAX-WS al usar Java SE 6 o posterior, verifique si existen notas de compatibilidad JVM para la distribución CXF usada.

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.


Descargar

DescripciónNombretamaño
Source code for this articlej-jws12.zip16KB

Recursos

Aprender

Obtener los productos y tecnologías

  • CXF: Descargue CXF.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


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