viernes, 6 de septiembre de 2013

Como consumir servicios web con Tapestry5 y JAXB

En el post anterior aquí (aquí) vimos como se creaba un servicio web que nos devolvía en XML las direcciones que tenemos almacenadas. Ahora vamos a consumir el servicio web mediante un DefaultHttpClient y un HttpGet que nos traerán la información. Una vez realizado este paso tenemos que usar de nuevo el Unmarshall para extraer un objeto DireccionResponse y tendremos así en su interior una lista con las direcciones que tenemos en base de datos. El código que tenemos que emplear es el siguiente:

Como crear servicios web con Tapestry5 y JAXB


En las anteriores entradas del blog que hablábamos de JAXB hemos mostrado como realizar las operaciones de marshalling y unmarshalling, es decir como obtener archivos XML a partir de una serie de objetos y como obtener una colección de objetos a partir de ficheros XML. Podéis encontrar el primer post de la serie (aquí)
Ahora vamos a implementar un servicioWeb en Tapestry usando JAXB y las clases que nos creamos en los post anteriores. Primero vamos a crear un servicio web que nos devuelva todas las direcciones que tenemos almacenadas en la base de datos. Para ello vamos a usar las clases Direccion.java y DireccionResponse.java. Si recordamos, Direccion.java mapeaba mediante Hibernate la tabla direccion de PostgreSQL mientras que DireccionResponse.java nos permitía crearnos un único objeto que contenía una lista de objetos Direccion de modo que al marshall de JAXB solamente le pasábamos un objeto. Estas dos clases las tenemos en la carpeta entities de nuestro proyecto y su contenido es el siguiente. Primero Direccion.java:

JAXB. Realizar el mapeo a XML con relaciones cruzadas. El error com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML

Si habéis seguido los ejemplos anteriores sobre JAXB (aquí, aquí, aquí y aquí), tenemos creadas una clase Cliente y una clase Direccion relacionadas entre si, donde uno de los atributos de la clase Direccion es un Cliente, de modo que podemos tener identificadas las múltiples direcciones de un cliente almacenadas en base de datos. Además creamos XML a partir de una lista de direcciones y creamos una lista de objetos Direccion mediante un fichero XML empleando en ambos casos una clase intermedia que llamamos DireccionResponse que nos permitía pasar al Marshall un solo objeto aunque este tenga en su interior una lista.

JAXB. Realizando XML de una Lista de objetos

Si hemos seguido los ejemplos anteriores  de como obtener ficheros XML a partir de objetos y como obtener objetos a partir de ficheros XML que vimos en los dos post anteriores (aquí y aquí), ya conocemos un poco sobre el Marshalling y Unmarshalling de este tipo de componentes.
Ahora vamos a ir complicando un poco el tema. Vamos a crearnos una tabla que se llama direcciones y que está relacionada con la tabla clientes, de modo que podemos guardar varias direcciones asociadas a un mismo cliente. Nos crearemos por lo tanto la siguiente tabla en PostgreSQL junto con su relación:

JAXB. Obtener una lista de objetos a partir de un XML

Ya vimos en el post anterior (aquí) como se obtiene un XML de una lista de objetos, ahora vamos a realizar el paso inverso, vamos a obtener una lista de objetos a partir de un fichero XML. Pare ello usaremos el fichero salidaDirecciones.xml que creamos en el ejemplo anterior.
Para ello tenemos que volver a emplear la clase DireccionResponse ya que obtendremos un objeto de esta clase y tendremos entonces que acceder a la lista que contiene para poder crearnos los objetos que deseamos. 
El código que necesitamos es el siguiente:

JAXB. Introducción. Crear un objeto a partir de un XML en Java

Como vimos en la entrada anterior (aquí), podemos crear un fichero con el contenido en XML de un objeto. Ahora vamos a realizar la operación contraria. Partimos de un fichero que vamos a leer con el contenido en XML y vamos a crearnos un objeto.

El fichero con el xml del que partimos es el mismo que en la entrada anterior y el siguiente:

JAXB. Introducción. Crear un archivo XML a partir de un objeto en Java

JAXB (Java Architecture for XML Binding) es un paquete del estándar Java que permite realizar mapeos entre clases Java y ficheros XML. Es bastante empleado, por ejemplo, a la hora de realizar servicios web como veremos en entradas posteriores. Como me toca empollarme este paquete para realizar una implementación vamos a ir poniendo ejemplos que me permita documentar lo aprendido y a la misma vez sirvan a la comunidad para aprender más rápido. 
Como habitualmente trabajo contra PostgreSQL, iré poniendo las sentencias para crear las tablas que posteriormente mapearemos con clases Java para terminar viendo como se implementan las anotaciones con JAXB y posteriormente lo que se conoce como Marshalling y unMarshalling, es decir, de objetos Java a XML y de ficheros con XML a objetos Java.  Además emplearé Annotations e Hibernate, herramientas ampliamente empleadas y que seguramente serán de sobra conocidas.