CXF- WebService rápido con Maven

En esta ocasión vamos abordar la creación de un servicio web con CXF.  En esta primera entrega intentaremos crear un servidor del WS , y cuando tenga un rato libre abordaré la creación de uno o dos clientes.  Como siempre la herramienta a emplear será Maven para gestionar todo el ciclo de vida. Segunda entrega disponible aquí, en la cual se crea un cliente para importar desde los clientes. Cuando pueda añadiré una entrada con un cliente del ws.

Edito: Como esta entrada es una de las que más visitas registra del blog, he decidido revisar la entrada y tal y como hago ultimamente publicar el código fuente con el proyecto maven completo. Si esta entrada no cumple tus intereses quiesta otra sí que te sirva.


Asumo que se tiene instalado un entorno de trabajo tal cual se describe en esta entrada de este blog. A saber un eclipse, un  tomcat, un jdk y maven. Todos ellos razonablemente bien configurados. Comentar que aunque existe un plugin de maven para eclipse no siempre lo utilizo, de hecho suelo configurar eclipse para que me utilice el maven "externo" ya que me trabaja mejor que el plugin.

Empezaremos buscando a ver que prototipos de proyecto CXF nos proporciona maven. Desde la consola escribimos: "mvn archetype:generate"

C:\work\apache-maven-3.0.3\bin>mvn archetype:generate
[INFO] Scanning for projects...
....

Ahora nos pedirá que le introduzcamos un arquetipo o que pongamos un filtro. Como queremos realizar un proyecto cxf introducimos "cxf"
mvn archetype:generate

Nos ofrece ocho tipos. Elegimos el primero que corresponde con cxf-http-basic, el cual a su vez tiene 12 versiones. Elegimos la 12., la 2.1.3 ¿por qué? Por nada en especial.
Ahora me pide el groupId: Le indico que "home", el nombre del artefacto: "firstcxf", version:1.0.0,
package: soy.guapo.home.

Una vez confirmemos los valores deberíamos tener una carpeta con el nombre del artefacto, preparada para importarla con eclipse. Que és lo que hacemos, a partir de aquí trabajaremos en este proyecto desde el IDE.

Si has seguido los pasos hasta aquí verás que eclipse te indica que  algo está  mal. Maven es bueno, muy bueno, pero no está exento de errores.Vamos a arreglarlo.

Abre los paquetes soy.guapo.home. Allí encontrarás dos clases java HelloWorld.java que no es una clase, sino una interfaz y HelloWorldImpl.java que implementa la interfaz. Verás que maven ha indicado que dichas clases pertenecen al paquete org.apache.cxf, en vez de soy.guapo.home. No tienes más que corregir poniendo "package soy.guapo.home" y solucionado. Asumo que has puesto los nombres de artefactos y paquetes que he indicado.

Puedes observar que existe una anotación en la implementación, corrije también para que apunte correctamente a la interfaz con
@WebService(endpointInterface = "soy.guapo.home.HelloWorld")

Llegado este momento quizá debas hacer un maven package y desplegarlo para comprobar que todo va bien...y.... .Wrong!!! algo ha fallado. Si miras la consola del tomcat, como es mi caso, aparece que algo ha fallado al instanciar un bean. Lo que ha ocurrido es que se ha intentado instanciar una clase que no está donde debería estar.

Vamos a la carpeta src – main- webapp-WEB-INF y allí tenemos el archivo beans.xml . Si lo abrimos veremos que pone:

<jaxws:endpoint
id="helloWorld"
implementor="org.apache.cxf.HelloWorldImpl"
address="/HelloWorld" />

Tienes que modificar aquí también  el paquete de HelloWorldImpl  ya que venía inicial (y erroneamente) indicada como del paquete org.apache.cxf. Cambiamos para tener soy.guapo.home

<jaxws:endpoint
id="helloWorld"
implementor="soy.guapo.home.HelloWorldImpl"
address="/HelloWorld" />

Y probamos de nuevo...
Ahora sí, si vamos a nuestro tomcat veremos una página que nos indica que hay algo... http://localhost:7777/firstcxf

Deberías ver algo como esto:

Available services:
HelloWorld
  • sayHi
Endpoint address: http://192.168.2.52:7777/firstcxf/HelloWorld
Wsdl: {http://home.guapo.soy/}HelloWorldImplService
Target namespace: http://home.guapo.soy/

Tenemos un método "sayHi" y destacar la url del wsdl y del endpoint. En mi caso despliego en un tomcat remoto en http://192.168.2.52 y sobre el puerto 7777. Valores que dependerán de dónde y como esté configurado el tomcat.

Se trataría ahora de probar que el WS funciona. La opción natural sería crear un cliente, pero sería muy largo. La opción razonable sería utilizar una herramienta como SOAPUI. http://www.soapui.org/ y por último la opción rápida sería utilizar el propio eclipse, en su edición para programadores J2EE, que lleva incorporada una utilidad para estos menesteres.
En la perspectiva de JavaEE aparece en la barra de herramientas, junto al "OpenWebBrowser" uno de "Launch Web Services Explorer". Hacemos click en él.
En la parte superior buscamos un icono "wsdl Page". Lo que nos interesa es importar el WS de la "Web Services Description Language"

Añadimos la url del wsdl http://localhost:8080/firstcxfHelloWorld?wsdl y a partir de aquí te dejo que  investigues un poco tí mismo.
Como no podía ser de otro modo en un "HelloWorld" la lógica es muy sencilla y está en HelloWorldImpl.java. Simplemente entra un nombre y te devuelve una cadena  con un "Hello "+ nombre. en la próxima entrega ampliaremos los métodos de este ws.


Comentarios

  1. Muy bueno. Ahora sería interesante que publicaras cómo utilizar maven desde eclipse pero sin el plugin tal como lo mencionas anteriormente.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Primero tienes que añadir una referencia a tu Maven, menú preferencias, seleccionamos Maven y el apartado "installations" desde ahí puedes añadir una referencia a tu Maven externo pulsando sobre el botón "Add...".

      Luego haces click con el botón derecho sobre el proyecto, seleccionas "Run As..." y "run configurations". Ahi seleccionas una ya creada o una nueva del grupo "Maven Build".
      En la parte baja de la pestaña "Main" tienes un desplegable que te permite elegir entre el embebido o uno externo. Elijes el externo para la ejecucción de esa configuración y guardas cambios.

      Eliminar
    2. Ah ok, muchas gracias. Por un momento pense que no utilizabas el plugin de maven. Entonces sí lo utilizas solo que cambias del maven embebido al que instalamos localmente. Una más amigo, mencionas que es mejor el local que el embebido, en lo particular a mí me ayudo al igual que a ti la version local ya que la puedo manipular en el caso de utilizar un proxy para bajar las dependencias, y en tu caso ¿cuál fué la razón?

      Eliminar
    3. Si te soy sincero no lo recuerdo exactamente. En el trabajo utilizamos un repositorio propio "nexus" y este ya lo tenía configurado en el Maven local, por otro lado no sé si el embebido lo tenía apuntando a "otro" repositorio que me listaba distintos arquetypes. Posiblemente el embebido se pueda configurar tan bien como el externo, pero resulta tan sencillo atacar el maven externo que me da la sensación de que gana en estabilidady posibilidades de ajuste... (mi jefe compila desde consola.... yo no llego a eso)
      Posiblemente lleve a confusión mi comentario de utilizar el maven sin el plugin.Evidentemente sigo utilizando el interfaz que me proporciona el plugin.

      Eliminar
    4. Estos dias por un escenario muy particular he tenido que hacer eso. Lanzar maven sin el plugin de maven. Es una forma un poco artificiosa pero efectiva. La idea base es utilizar el "External Tools Configuration...", que está a la derecha del "Run" y desde ahí lanzar la aplicación deseada.
      Habitualmente utilizo esa opción para apuntar a archivos bat que me crean VPN, me levantan BBDD, tomcat's etc o me abren el Soap-UI

      Eliminar
  2. Otro detalle que encontre es que tienes que especificar este repositorio para que encuentre las dependencias de cxf



    java.net
    http://download.java.net/maven/2




    ya que por default te toma



    java.net
    http://download.java.net/maven/1



    y no las encuentra. Seguramente cuando repetiste el experimento como ya la tenias en tu repo local ya no te marco nada.

    Saludos.

    ResponderEliminar
  3. Como esta entrada es una de las que más visitas registra del blog, he decidido revisar la entrada y tal y como hago ultimamente publicar el código fuente con el proyecto maven completo. Dicha entrada es http://sinjava.blogspot.com.es/2012/11/holamundo-cxf-spring.html. Poner para descarga el proyecto debería servir para subsanar alguna omisión involuntaria que pudiera tener.
    En esta nueva entrada hay tres cambios principales, meto un poco más de lógica de negocio (lógica "foo", claro), trabajo más con el framework spring, algo casi inevitable hoy en dia, y meto logs que me parece la forma optima de trabajar en desarrollo cuando se empiezan a meter varios frameworks en un proyecto.

    ResponderEliminar
  4. Enhorabuena por seguir el camino de los desarolladores que aportan sus conocimientos a la comunidad, valerosa y desinteresadamente.
    Este ejemplo funciona a la perfección, si bien he tenido que caer en la cuenta de que en últimas versiones de Eclipse "hacer maven package y desplegarlo" equivale a correr como "Maven build" con goal "tomcat:run".
    Esto creo que queda claro en la versión 2ª del tutorial, que ahora me voy a leer.
    Gracias otra vez, y adelante con el blog.

    ResponderEliminar

Publicar un comentario

Sin Java agradece sus comentarios