Primeros pasos con Apache CXF

Primeros pasos con Apache CXF

0. Índice de contenidos.

1. Entorno

Este tutorial está desarrollado usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 2Ghz Intel Core i7 (4 núcleos) 8Gb de RAM
  • Sistema Operativo: Mac OS X 10.7.2 (Lion)
  • Eclipse Indigo (Revisar tutorial de Alex para su instalación)
  • Apache Tomcat 7 (instalado e integrado en eclipse)
  • Versión de java SDK 6 instalada en el sistema

2. Introducción

En este tutorial veremos como realizar servicios con Apache CXF basados en JAX-WS (http://en.wikipedia.org/wiki/JAX-WS) utilizando las WST de eclipse.

Apache CXF es un framework de Web Services que nace de la combinación de dos proyectos open source Celtix y XFire. Sus principales caracteristicas son (sacado de la wikipedia):

  • Web Services Standards
    • SOAP
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-SecureConversation
    • WS-Security
    • WS-SecurityPolicy
  • JAX-WS API for Web service development
    • Java first support
    • WSDL first tooling
  • JAX-RS (JSR 311 1.1) API for RESTful Web service development
  • JavaScript programming model for service and client development
  • Maven tooling
  • CORBA support
  • HTTP and JMS transport layers
  • Embeddable Deployment:
    • ServiceMix or other JBI containers
    • Geronimo or other Java EE containers
    • Tomcat or other servlet containers
    • OSGi
  • Reference OSGi Remote Services implementation

3. Configuración de eclipse

Primero de todo debemos configurar eclipse con la versión de CXF que vayamos a utilizar:

Configuración de eclipse

Configuración de eclipse

Configuración de eclipse

Configuración de eclipse

Una vez configurado podremos utilizarlo en el asistente de creación de webservices.

4. Aproximaciones. Code First

En esta primera aproximación partimos de una clase que expondrá los métodos que le especifiquemos explicitamente en el webservice. Para ello creamos un nuevo proyecto java y codificamos una interfaz (a la que llamaremos SEI) con su implementación, y una entidad Persona. Para la persistencia utlizaremos un HashMap que almacenará las personas:

Creación de proyecto java

Creación de proyecto java

Creación de proyecto java

Creación de proyecto java

Entidad:

Singleton que mantiene la persistencia de las personas:

Interfaz:

Implementación:

Una vez definidas las clases, hacemos click derecho sobre la implementación y webservices –> createwebservice y seguimos los siguientes pasos:

Creación webservice

Creación webservice

Creación webservice

Creación webservice

Creación webservice

Creación webservice

Creación webservice

Creación webservice

Lo primero que vemos es que nos ha anotado la clase que implementaba el servicio con las anotaciones de JAX-WS, y adicionalmente se han creado los tipos de request-response para cada una de las operaciones:

Clases que componen el mensaje de request-response

Despues se ha creado un proyecto web en el que lo mas relevante es que se ha generado el wsdl y adicionalmente se ha creado un xsd que contiene la definición de los tipos. Además se ha configurado el contenedor web y la configuración de Spring:

Proyecto web generado

personasserviceimpl_schema1.xsd

personasserviceimpl.wsdl

beans.xml

web.xml

Prueba del Servicio. Si hacemos click derecho sobre el wsdl seleccionando webservices–>Test with webservices explorer y realizamos una petición de addPersona

Invocación webservice

Invocación webservice

Invocación webservice

Si revisamos los logs del servidor, podemos ver todos los datos de la petición y la respuesta

Podeis invocar a las demás operaciones para probar que todo está ok.

5. Aproximaciones. Contract First

La segunda aproximación es partiendo del contrato, es decir, el wsdl. Para ello utilizaremos el wsdl generado en el punto anterior. Si realizamos un click derecho sobre el WSDL y después realizamos los siguientes pasos:

Web Service skeleton

Web Service skeleton

Web Service skeleton

Web Service skeleton

Web Service skeleton

Web Service skeleton

Generaremos el esqueleto del webservice, en el cual tan solo deberemos modificar la clase PersonasServiceImplImpl con nuestra implementación, ya que al partir del contrato, no tenemos la lógica de negocio del servicio.

Web Service skeleton

6. Conclusiones

Como hemos podido comprobar, es bastante sencillo realizar webservices con estas herramientas, ya que las WST nos proveen una forma cómoda de trabajar con los comandos wsdl2java y java2wsdl que implementa la distribución de Apache CXF. Aunque es una forma muy rápida de implementar los webservices, os recomiendo que lo hagais simplemente para construir el esqueleto de vuestro servicio para después pasarlo a un proyecto maven.

Los siguientes tutoriales sobre apache cxf serán construidos con maven basandonos en la arquitectura que hemos visto.

Como nota significativa y adicional a la generación del webservice desde una clase java, es que la implementación del WSDL es siempre document-literal, ya que los webservices son mucho mas interoperables trabajando en este formato (revisar http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/). Si partimos de la generación del webservice desde el WSDL y el formato es rpc-encoded, apache cxf obtendremos un error (ya que no cumple la WS-I Compliance, mas información en http://www.ws-i.org/), ya que se está quedando obsoleto el formato RPC. Para terminar, recomiendo el uso de apache cxf para implementar WebServices, dado que cubre casi todas las necesidades y está bastante documentado, además de ser motor de webservices por defecto en muchas plataformas ESB opensource y de pago.

Cualquier duda o sugerencia podeis comentarlo.

Saludos.