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
)
0