Jugando con Hibernate y Json

Ver Comentarios

Posted on : 15-10-2009 | By : Carlos Cordero | In : Internet, Java, Software

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.

Servicios Web REST

Ver Comentarios

Posted on : 25-09-2009 | By : Carlos Cordero | In : Java, PHP, Software

Me encantan esos días en los que puedes dedicarte a investigar, el hecho de poder leer mucha documentación para encontrar la mejor solución a un problema, sin presiones, sin plazos de entrega…

Para ponernos en situación, tenemos una especie de modelo editorial donde se almacenan cantidades más ó menos importantes de datos, desarrollado en java con toda la pesca incluída: Spring, Hibernate y usando MySQL como BD. Meses atrás se hizo a toda prisa una aplicación web de consulta, en este caso en PHP. Si, se que alguno querrá arrancarse los ojos al leer esto pero: el código de PHP lanza querys directas contra la BD (es decir, se pasa el modelo de ORM de Hibernate por los santos)… que queréis, se hizo en día y medio, cosas de los plazos.

Por si alguno todavía no se ha dado cuenta, eso tiene un grave problema (dejando de lado que es una chapuza increíble) y es que requiere trasladar todos los cambios que se hagan en el modelo a nuestra aplicación PHP (y normalmente suele pasar que se olvida y falla en el peor momento). A la hora de cambiar esto, se podría optar por utilizar algún tipo de implementación PHP sobre JAVA tipo Quercus (que ya utilizamos en otra rama), pero viendo los dolores de cabeza que ha dado, prefería evitarlo…

¿Solución? Servicios Web. ¿SOAP? ¡Mucho lio! … Mejor solución: REST (Representational state transfer): una solución de arquitectura “parida” para las necesidades justas que tenemos, y en este caso, limitadas a peticiones GET y algún POST (quizás para las búsquedas…). Ya tenemos nuestra solución: servicios web REST que den una salida JSON. El motivo de dar una salida JSON es evidente: queremos que sea interpretado por PHP, el cual tiene las funciones específicas para ello, y de esa forma no nos limitamos a ninguna arquitectura (nunca se sabe…).

Ahora viene el lado servidor, tenemos que implementar los servicios web en JAVA y sobre todo, tenemos que mantener y aprovechar la arquitectura existente. Ah! Una última cosa… no podemos depender de un contenedor específico, por si acaso ;)

De nuevo, solución: JAX-RS, la solución más sencilla que nos aporta JAVA para montar servicios REST. En este caso hemos utilizado una implementación que se llama Jersey (que queréis que haga si le ponen esos nombres…). Utilizando maven se ha vuelto muy sencillo, unas dependencias por aquí, otras por allá, y todo ready! Aqui os dejo el “getting started” de Jersey, si miráis el código os quedaréis muy sorprendidos, al fin y al cabo utiliza POJOs.

 1    // The Java class will be hosted at the URI path "/helloworld"
 2    @Path("/helloworld")
 3    public class HelloWorldResource {
 4
 5        // The Java method will process HTTP GET requests
 6        @GET
 7        // The Java method will produce content identified by the MIME
 8        // type "text/plain"
 9        @Produces("text/plain")
10        public String getClichedMessage() {
11            // Return some cliched textual content
12            return "Hello World";
13        }
14    }

Admito que he estado un par de horas pegándome con un conflicto de versiones de dependencias que tenían jersey e hibernate, causados por la librería asm, cosa de tener ya un sistema montado por detrás. Ahora mismo no lo recuerdo exáctamente, pero creo que hibernate utilizaba la rama 1.x de asm y jersey la 2.x, algunos métodos han cambiado y… POUM! Las últimas versiones de hibernate ya no tienen esa dependencia así que sólo había que incluirla en el ignore de maven para hibernate y todo solucionado. ¿Veis? Si hubiese mirado los foros de hibernate antes… me hubiese evitado ese tiempo de pelea con el tomcat (si, lo he montado sobre un tomcat, aunque supongo que termine en un resin).

Si alguno monta un servicio con esto, ya me enviará la URL para probarlo (si es público claro ;) )

Una pequeña actualización…

Ver Comentarios

Posted on : 18-08-2008 | By : Carlos Cordero | In : Enlaces, Internet, Software

Lo sé, he vuelto a cambiar el diseño… pero que queréis, cada uno tiene sus defectos, y yo me canso de los diseños muy rápido. A ver si este aguanta un poquito más…

Poco he podido actualizar el blog estas últimas semanas… soy de ese “selecto” grupo de personas que este verano entenderán las vacaciones como salir a pasear con el perro o ir a la compra… vamos, que me toca trabajar como un mamoncete.

Sin embargo, no todo es tan malo, digamos que en estas últimas semanas he aprendido muchas más cosas que en varios meses… y al final no pude resistirme, he caído en la tentación de un precioso iPhone 3G; lo tengo hace 3 días y por ahora todo lo que puedo decir son cosas buenas. Si, se que en muchos sitios se ha comentado que “está muy capado”, pero supongo que como eso ya lo sabía antes de comprarlo, no me ha decepcionado. La conectividad es muy buena… y el sistema de GPS que incorpora me ha dejado con la boca abierta: el uso del propio GPS y de las celdas de localización GSM permite que el móvil te localice incluso dentro de un baño con la puerta cerrada y sin ventanas.

En el aspecto más “pofesional” (si si, POfesional…), estas últimas semanas he trabajado con cosas muy interesantes, pero si tengo que resumirlo, me quedo con la tecnología de virtualización ESXi de VMware y con todo lo que he aprendido de J2EE, struts, contenedores e hibernate.

A modo de lista para recordar, tengo pendiente desarrollar varios posts sobre:

  • ESXi de VMware: instalación, configuración, rendimiento…
  • Hibernate: La resolución de algunos problemas que hemos detectado…
  • Algo de Oracle… webservices… weblogic…

Me he pegado con tantas cosas estos días que siento que debo compartirlas poco a poco… ;)

Un saludo

Una pequeña actualización: También escribiré sobre la implantación de un sistema de control de versiónes SVN (Subversion) en una oficina en funcionamiento…