Jugando con Hibernate y Json

Publicado: 15-10-2009 | Por: Carlos Cordero | Categoría: Internet, Java, Software
Comentarios: Ver Comentarios

Unos duermen a las 8 de la mañana, otros están en el atasco (que asco) y otros nos divertimos jugando con el código como si fuese un trozo de arcilla. No hay nada más divertido en Java como descubrir toda clase de excepciones que más que informarte de algo parece que te insulten… “UndeclaredThrowableExceptiondice, pero a mi siempre me ha sonado a “¿pero que coño acabas de intentar hacer loco?

Aunque ya llevo unos días jugando con servicios web, JSON y java (post relacionado) fue ayer cuando, después de una conversación de cigarro, quise probar a hacer la serialización de POJOs recuperados con hibernate, tal cual, sin filtrar nada y en el menor número de líneas posible: bueno, pues se puede hacer en 3 lineas de código. Si “fale”, le faltará un poquito de tweaking pero por algo se empieza (por cierto, una de las líneas es la que recupera el objeto persistido).

El misterio de la cuestión está en estas dos líneas:

XStream xstream = new XStream(new JettisonDriver()); 
String xml = xstream.toXML(taxon);

Para más información, XStream es una librería para la serialización de objetos en XML, con la ventaja de poder setearle un driver específico, en este caso uno que encontré rebuscando en foros, JettisonDriver(), cuya mayor ventaja además de serializar en JSON es que permite des-serializar igualmente.

Por cierto, un tip adicional si estáis trabajando con Hibernate y queréis tirar alguna query HQL para sacar los datos a serializar.  Hibernate utiliza CGLIB para la generación de ciertas partes de código al vuelo (más info, Reflection Java) y por lo tanto, es muy posible que nos encontremos con clases que han pasado por el proxy, las cuales se identificar por tener $EnhancerByCGLIB$ en el tipo de clase… por lo que el serializador no funcionará correctamente (serializará la parte del proxy).

Solución sencilla:

((HibernateProxy)OBJETO()).getHibernateLazyInitializer().getImplementation();

Prometo que encontrar esa línea me costo sudor y horas la primera vez que me pegué con ello.



Otros posts relacionados

  • Daniel Villalobos

    Saludos amigo me encuentro en ese mismo problema y veo q tu implementacion es bien sencilla y practica pero podrias realizar un ejemplo de como deberia utilizar todo gracias.

  • alejandro santillan

    Si por fa, por un ejemplo… que me estoy peleando con eso :D nnSaludos

blog comments powered by Disqus