lunes, 19 de septiembre de 2011

GRAILS - Servicios web con CXF

A la hora de crear servicios web el plugin cxf de grails nos facilita mucho esta tarea, permitiéndonos crear un servicio web en cuestión de minutos. (He de puntualizar que tardas poco si son servicios web sencillos, como te plantees cosas más complejas como devolver o aceptar mapas por parámetros la cosa se complica...)

Veamos cómo poner un servicio web en funcionamiento usando este plugin.
El primer paso es... instalarlo:

install-plugin cxf
Bueno, una vez tenemos instalado el plugin, debemos crear un servicio que será el que contenga los métodos que queremos exponer en el servicio web.
create-service miServicio
Y ahora en el service debemos declarar la propiedad estática expose para que este plugin identifique este service como servicio web. En esta propiedad podemos especificar dos valores distintos según lo que necesitemos:
  • cxf - todos los métodos que aparezcan en el service serán identificados como métodos a exponer en el servicio web. Si se quiere excluir algún método hay que incluir su nombre en la propiedad estática exclude.
  • cxfjax - en caso de que necesitemos utilizar anotaciones JaxWS debemos utilizar esta opción en lugar de cxf (éste ignorará las anotaciones). En este caso ningún método se expondrá por defecto si no que habrá que incluir la anotación @WebMethod sobre los métodos que se quieran exponer. 
Veamos un ejemplo para cada uno de los valores.
class MiServicioService{
  static expose=['cxf']
  static exclude=['esteNoExpongo']
  
  String metodoExpuesto(){
    return "Hola"
  }

  String esteNoExpongo(){
    return "este no lo verás"
  }
}
class MiServicioService{
  static expose=['cxfjax']
  
  @WebMethod
  String metodoExpuesto(){
    return "Hola"
  }

  String esteNoExpongo(){
    return "este no lo verás"
  }
}
Bueno, pues cuando arranquemos la aplicación tendremos acceso al wsdl de la aplicación en la siguiente ruta:
http://localhost:8080/nombreApp/services/miServicio?wsdl
Según la página del plugin (y hay que hacerlo, creedme) en toda clase que se devuelva o se pase como parámetro hay que anotarlas con @XmlAccessorType(XmlAccessType.FIELD) por algun problema con JAXB y las metaclases.

Espero que os haya servido esta breve explicación y si no no dudéis en preguntar o ir a la propia página del plugin.
Enjoy!

4 comentarios:

Hola!
quisiera preguntarte, de esta manera creas un web service con cxf, pero, como se hace un cliente cxf de este web service?? es que, habitualmente los hago con ws-client, pero habiendo tenido que emplear cxf para hacer un ws, me resultan incompatibles.

muchas gracias!

Hola,
Cliente con cfx que yo sepa no se puede crear. Cuando me pasó una vez el escenario que comentas, probé dos cosas que creo que funcionaban, aunque al final me quedé con la segunda.
Una opción es que vayas a la carpeta del plugin ws-client una vez instalado y borres una libreria que comienza con cxf. Con esto creo que funcionaba.
La otra opción, como hacer un cliente con groovy es muy sencillo, es seguir los pasos de aquí: http://groovy.codehaus.org/GroovyWS.
Si necesitas más explicación me dices.
Saludos!

Hacer ws con estos plugins (cxf, xfire...) es muy cómodo pero un problema con el que me he topado con estos plugin es la falta de control sobre el wdsl generado. Si, por ejemplo, quiero modificar el parámetro minoccurs de uno de los campos que enviamos... se puede hacer o nos veremos obligados a usar plugins contract-first como spring-ws para generar el código a partir de nuestro wsdl y no al revés?

Hola,

Concretamente con minoccurs no sabría decirte, pero si pones expose=['cxfjax'] admite las anotaciones. Por ejemplo podrías cambiar el nombre de un parámetro con las anotaciones @WebParams. Supongo que es cuestión de investigar si existen las anotaciones o formas adecuadas para cambiar los datos que quieras del wsdl generado.

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More