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:
viernes, 6 de septiembre de 2013
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:
Etiquetas:
java
,
jaxb
,
servicios web
,
tapestry5
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.
Suscribirse a:
Entradas
(
Atom
)