domingo, 8 de mayo de 2011

Desarrollo en Java – Primer WebService y JPA

Para llevar a cabo este tutorial es necesario tener instalados como mínimo MySQL y NetBeans, bastará con seguir las guías de instalación que se encuentran en los enlaces anteriores.
Manos a la obra, en esta entrada del blog no vamos a entrar en detalles teóricos de la tecnología que vamos a usar, ya habrá oportunidad de hacerlo en futuras entradas, por el momento nos dedicaremos a lograr el objetivo paso a paso, con una sola clase como ejemplo, empecemos:

La versión de NetBeans con la que vamos a trabajar es la versión 7.0, salió publicada mas o menos el 20 de Abril pasado, es bastante reciente y a la fecha aún no tenemos una versión en español por lo que usaremos la versión en ingles.
07-05-2011 09-10-36 p.m
Para los que han trabajado anteriormente con NetBeans no encontrarán muchas diferencias en la interfaz con relación a versiones anteriores, la pantalla de carga inicial si es muy diferente, la interfaz de desarrollo no lo es tanto, luego de la carga inicial vamos a crear un proyecto, para ello vamos al elemento de menú File y luego a New Project…, también podemos usar el short-cut Ctrl+May+N.
07-05-2011 09-13-27 p.m 07-05-2011 09-13-46 p.m
Luego aparecerá la interfaz de creación de proyecto, en la que elegiremos un tipo específico de proyecto, para el objetivo actual vamos a elegir la categoría Java Web e internamente el proyecto Web Application, si se trata de la primera vez que estamos cargando un proyecto de este tipo también observaremos el proceso de activación del Java Web y el EE en el NetBeans.
07-05-2011 09-14-08 p.m 07-05-2011 09-14-20 p.m
Luego, el asistente nos solicitará el nombre del proyecto y la ubicación, como nombre usaremos “proyecto”, y la ubicación que usaremos será la ubicación por default, se presiona el botón Next y se procede a la elección del servidor y la versión del Java EE, como servidor se usará el Glassfish y la versión de Java EE será la Java EE 6 Web.
07-05-2011 09-14-47 p.m 07-05-2011 09-15-00 p.m
La última parte del asistente es la elección de los frameworks que vamos a implementar en el proyecto, en este caso en particular no implementaremos ningún framework en especial, se presiona el botón Finish y el asistente procederá a la creación de todos los archivos básicos del proyecto, esto tomará algunos segundos y tiene una barra de progreso indicadora.
07-05-2011 09-15-09 p.m 07-05-2011 09-15-20 p.m
Al finalizar la generación de los archivos del proyecto, tendremos una vista como la mostrada en la siguiente imagen, donde se puede apreciar la estructura de archivos del proyecto.
07-05-2011 09-15-28 p.m
Ahora es momento de configurar el servidor de base de datos, para las labores de contención de datos de los proyectos que vamos a desarrollar, en el panel de la derecha, a la altura de la pestaña Projects se encuentra la pestaña Services, dentro de la cual existen cinco grupos de servicios, el grupo que nos interesa es el de Databases, lo desplegamos y tenemos un gestor de bases de datos registrado (Java DB) y una base de datos registrada (sample, el tercer item dentro del grupo Databases).
07-05-2011 09-51-33 p.m 07-05-2011 09-51-40 p.m
Lo siguiente a hacer será registrar el servidor de bases de datos MySQL, instalado como se indica en el tutorial de instalación de MySQL, para ello damos clic derecho en el grupo Databases, y se elegirá el elemento Register MySQL Server…, ya que vamos a registrar la instancia de MySQL instalada anterioremente, finalmente será necesario el ingreso de la información solicitada para el registro de la instancia de MySQL, asumiendo que no hay datos modificados durante el proceso de instalación del MySQL, sólo será necesario el ingreso de la contraseña de administrador de la instancia de MySQL.
07-05-2011 09-51-49 p.m 07-05-2011 09-52-04 p.m
Terminado el proceso anterior, tendremos un nuevo elemento dentro del grupo de servicios Databases, este nuevo elemento representa a la instancia del servidor MySQL y muestra también el puerto desde donde se está accediendo a los servicios de la instancia.
07-05-2011 09-52-14 p.m
Una vez registrada la instancia de MySQL es necesario conectarla, para ello damos clic derecho sobre el nombre de la instancia registrada y seleccionamos Connect, si las credenciales entregadas antes son correctas y el servidor esta en funcionamiento (el servicio de MySQL esta en ejecución) se desplegará la relación de bases de datos registradas en la instancia.
07-05-2011 09-52-32 p.m 07-05-2011 09-52-43 p.m
Ahora podremos crear una base de datos, las funciones de administración del servidor de bases de datos desde NetBeans son bastante básicas pero suficientes para cumplir con el objetivo del tutorial, damos clic derecho nuevamente sobre el nombre de la instancia registrada y esta vez seleccionamos Create Database…, luego de lo cual nos será solicitado el nombre de la base de datos, la cual se llamará “proyecto”.
07-05-2011 09-52-54 p.m 07-05-2011 09-53-05 p.m
Al terminar la creación de una nueva base de datos en MySQL se puede observar la aparición de un nuevo elemento dentro del registro del servidor MySQL, este nuevo elemento representa a la nueva base de datos de nombre “proyecto”, en la segunda imagen se observa el despliegue del otro nuevo elemento, el que aparece en el grupo de servicios Databases, este registro es específico para la base de datos y no para el servicio de MySQL, el nombre es jdbc:mysql://localhost:3306/proyecto y representa la conexión a la base de datos recién creada, al desplegar su contenido podemos observar claramente que no tiene ningún registro de tablas.
07-05-2011 09-53-21 p.m 07-05-2011 09-53-46 p.m
Una vez finalizado el registro del servidor de bases de datos (MySQL) y la creación de la base de datos con la que vamos a trabajar ya podemos regresar a la pestaña de proyectos, procederemos a crear una nueva clase Entidad, para ello bastará con darle clic derecho al nombre del proyecto y dentro de New elegimos Entity Class… le daremos como nombre Facultad y, para efectos de orden, el paquete donde lo pondremos se llamará clases, es necesario observar que el check de creación de unidad de persistencia este activado. Al hacer clic en el botón Next procederemos con la creación de la Unidad de Persistencia.
07-05-2011 09-54-05 p.m 07-05-2011 09-55-29 p.m
La unidad de persistencia contiene los datos de conexión específicos para la base de datos con la que vamos a trabajar, le asigna un nombre y gestiona la conexión con el servidor y la base de datos de trabajo. Dejaremos el nombre de la unidad de persistencia tal y como está, también dejaremos con el valor por default al Proveedor de Persistencia, EclipseLink (JPA 2.0)(default), luego procedemos con la creación del respectivo Data Source, para ello desplegamos el combo de Data Source y elegimos New Data Source….
07-05-2011 09-55-49 p.m 07-05-2011 09-55-57 p.m
En el nuevo cuadro de diálogo le asignamos un nombre a nuestro Data Source y una conexión, la misma que creamos luego de registrar al gestor de MySQL, hasta tener el cuadro de diálogo tal y como se observa en la imagen, luego presionamos el botón OK, finalmente la estrategia de generación de tablas será Drop and Create, ya que así nos aseguramos que las modificaciones introducidas en las clases sean replicadas en la base de datos, luego se presiona el botón Finish.
07-05-2011 09-56-37 p.m 07-05-2011 09-56-44 p.m
Finalizado el proceso anterior tenemos una nueva clase creada en la carpeta Source Packages, dentro del paquete clases, tal y como se observa en la siguiente imagen, esta clase es nuestro primer EJB (Enterprise Java Bean) del tipo Entidad, básicamente su función es modelar la base de datos por medio de JPA (Java Persistence API).
07-05-2011 09-57-05 p.m
Vamos a introducir un nuevo atributo en la clase, el atributo nombre de tipo String, para ello colocaremos el cursor justo debajo de la línea de definición del atributo id, es decir en la línea 23 de acuerdo con la imagen anterior, presionamos las teclas Alt+Insert y en el menú contextual elegimos Add Property… luego llenamos el cuadro de diálogo como se observa en la siguiente imagen, el código a insertar se muestra en la parte inferior de la imagen.
07-05-2011 09-58-26 p.m
El código autogenerado se insertará en la posición donde dejamos el cursor, por eso es importante invocar esta opción con el cursor justo debajo de la declaración del atributo id. para asegurarnos que el nuevo atributo sea también persistido, es necesario agregar una anotación encima del mismo, es decir, en la línea 24, la anotación será @Basic, la que le indica al compilador la obligatoriedad de persistir dicho atributo como columna en una tabla. Si es la primera vez que se lleva a cabo esto en una clase, saldrá un error detectado por el NetBeans.
07-05-2011 09-58-50 p.m
Si sale el error bastará con hacer un clic derecho en el icono del error (el foco con la admiración en rojo) y luego seleccionar el Add import… para que añada la respectiva instrucción import en la cabecera de la clase, como se puede observar en las imágenes siguientes.
 07-05-2011 09-58-59 p.m 07-05-2011 09-59-11 p.m
Ahora prepararemos otro EJB, esta vez del tipo Session Bean, basado en la entidad recién creada, para eso damos clic derecho en el nombre del proyecto, luego en New y en Other (ya que no se observa el enlace para Session Bean for Entity Clases), en la ventana emergente elegiremos la categoría Enterprise Java Beans y el tipo de archivo Session Bean for Entity Clases, presionamos el botón Next.
07-05-2011 09-59-47 p.m 07-05-2011 10-00-06 p.m
En la siguiente ventana nos muestra la relación de las clases entidad disponibles en nuestro proyecto, en nuestro caso sólo tenemos una, y la añadimos como Clase Entidad Seleccionada, presionamos el botón Next.
07-05-2011 10-00-22 p.m 07-05-2011 10-00-28 p.m
Como datos finales colocaremos el nombre del paquete, ya saben, con fines de mantener el orden y aislar los cambio, el nombre del paquete que usaremos será clases.beans, además ordenaremos que se cree una interfaz de tipo local, es local porque el acceso al session bean será en el mismo equipo y no desde otros equipos, al presionar el botón Finish observamos como se crean tres nuevos archivos en el paquete clases.beans.
07-05-2011 10-00-45 p.m 07-05-2011 10-01-04 p.m
Ahora estamos listos para la fase final, crearemos un Web Service, para ello nuevamente damos clic derecho sobre el nombre del proyecto, elegimos New y buscamos la opción Web Service…, luego tenemos un nuevo asistente, en el le daremos nombre al Web Service, el nombre elegido será ServicioWeb, la ubicación será en el paquete servicio, luego elegimos Create Web Service from Existing Session Bean y presionamos el botón Browse…
07-05-2011 10-01-28 p.m 07-05-2011 10-01-56 p.m
En la búsqueda nos muestra la relación de los EJBs de tipo session disponibles en el proyecto, sólo observamos el creado en el paso anterior, su nombre es FacultadFacade, una vez capturado el EJB, como se observa en la segunda imagen, podemos presionar el botón Finish.
07-05-2011 10-02-07 p.m 07-05-2011 10-02-30 p.m
Es tiempo de compilar y desplegar, la estructura del proyecto se observa en la primera imagen, si la ventana de salida de datos no se puede observar en la parte inferior de la IDE bastará con ir al menú Windows, luego a Output y dar clic Output, o presionar Ctrl+4.
07-05-2011 10-02-45 p.m 07-05-2011 10-04-21 p.m
Ahora damos clic derecho al nombre del proyecto y elegimos la tercera opción, Clean and Build, la que llevará a cabo el proceso de limpieza y compilación del proyecto, dicho proceso debe tener como resultado final una línea similar a la mostrada en la segunda imagen, con las palabras BUILD SUCCESSFUL de color verde.
07-05-2011 10-03-18 p.m 07-05-2011 10-04-37 p.m
Una vez compilado el proyecto es tiempo de desplegarlo, el despliegue se llevará a cabo en el servidor elegido originalmente al momento de crear el proyecto, en nuestro caso será el Glassfish. Debido a que este no es un proyecto estándar no vamos a “correr” el código (Run), lo que vamos a hacer es desplegar el código en el servidor de aplicaciones, para ello damos clic derecho en el nombre del proyecto, y buscamos la opción Deploy, en la ventana Output seleccionamos la pestaña Glassfish Server 3.1 y si no tenemos ningún problema, deberíamos tener una línea de salida similar a la resaltada en la segunda imagen, INFO: proyecto implementado correctamente en xx milisegundos.
07-05-2011 10-04-50 p.m 07-05-2011 10-06-17 p.m
Como fase final, es hora de probar el servicio web recién desplegado, para ello, en la estructura del proyecto, desplegamos la carpeta Web Services, encontramos nuestro ServicioWeb, le damos clic derecho y ubicamos la opción Test Web Service, la cual nos mostrará una página web con los servicios publicados en el web service.
07-05-2011 10-06-30 p.m
Ahora probaremos uno de los métodos publicados en el web service, si presionamos el botón count obtendremos el conteo de los objetos Facultad almacenados en la base de datos, como se observa en las imágenes, el resultado es cero, lo cual es perfectamente normal si consideramos que aún no hemos hecho ningún ingreso en la base de datos, sin embargo el obtener este número también nos confirma que todo esta funcionando bien. 
 07-05-2011 10-07-17 p.m 07-05-2011 10-07-32 p.m
Recuerdan como creamos una base de datos , haciendo uso de la pestaña servicios?, es momento de regresar al mismo sitio y ver si han habido cambios en la base de datos originalmente creada, para ello damos clic en la pestaña Services y buscamos la conexión a la base de datos que creamos al inicio del tutorial, le damos clic derecho y luego en Refresh, finalmente observamos como se han creado elementos que antes no se encontraban ahí, entre ellos las tablas facultad y sequence, además, dentro de la tabla facultad se encuentran los campos ID y NOMBRE los que coinciden con los atributos creados en la clase entidad creada anteriormente.
07-05-2011 10-07-55 p.m 08-05-2011 12-32-50 p.m.
El actual tutorial es sólo una simple exposición de los pasos para llevar a cabo múltiples tareas, como la creación de EJBs de tipo entidad, de tipo sesión y la creación de un Web Service, además nos muestra lo sencillo que es el uso de JPA para el manejo de la persistencia sin necesidad de trabajar demasiado a nivel del gestor de bases de datos, esto nos permitirá llevar a cabo el proceso de desarrollo sin perder de vista el modelo de clases ni el diseño orientado a objetos ya que será JPA quien administre la conversión entre el modelo orientado a objetos y el modelo relacional, basado en una conversión Objeto-Relacional.
Seguiré publicando artículos relacionados al tema, ya que se trata de una tecnología bastante desarrollada y madura en este momento, además, si tienen alguna duda o comentario háganlos que gustoso responderé.

16 comentarios:

  1. Cuando empiezo a crear el Segundo Web Service me manda un error Error durante la implementación: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: Servlet web service endpoint '' failure. Consulte /server.log para obtener más información.


    Solo pasa cuando creo un segundo servicio

    Carlos Portocarrero Tovar

    ResponderEliminar
  2. En realidad basta con crear un solo web service en el proyecto, ya que este web service servirá como interfaz de los servicios del proyecto

    ResponderEliminar
  3. tenga un buen dia profesor digame usted como se puede hacer con las demas entidades en el mismo webservis en mi trabajo solo le mande de faculad.
    Att.Ochoa Patiño V.

    ResponderEliminar
  4. creas todas las entidades, solo publicas el web service de una, con eso sería suficiente

    ResponderEliminar
  5. un post genial, despues de mucho tiempo he conseguido hacer lo que queria!! muchas gracias.

    me falta un ultimo paso, como instalo y pongo en produccion mi webservices??

    ResponderEliminar
    Respuestas
    1. me alegra que te haya gustado, la puesta en producción es relativamente sencilla, para poner en producción el webservice necesitas tener un servidor de aplicaciones (glassfish, tomcat, etc), en el caso de glassfish, basta con entrar a la interfaz administrativa y subir una nueva aplicación, ahí subes el archivo war ubicado en la carpeta dist de tu aplicación de netbeans... listo, aplicación corriendo en el servidor... saludos.

      Eliminar
    2. ivan podrias decirme algun servidor de aplicaciones que te guste, el que uses, como puedes ver es mi primera vez en todo esto pero le estoy sacando una de xixa... porcierto que es mejor k el servidor este en un linux o en un windows?

      Eliminar
    3. Bueno, el servidor de aplicaciones que uso es glassfish, ahora de oracle, es gratuito y esta muy bien integrado a netbeans, en segundo lugar estoy usando tomcat, tambien gratuito y en su version 7 con total soporte para java ee. Ambos son instalables en varias versiones de linux, en lo personal lo he implementado en Suse, no en otras versiones, para producción, hasta ahora sólo en windows. No podría afirmar si es mejor linux que windows... pero, al tratarse de tecnologia basada en java, pues Linux es muy superior en rendimiento, si lo confrontas con windows.

      Eliminar
  6. perdon por ser tan pesado pero queria consultarte una problemilla, consegui hacer el web service, consumirlo en un programa SE, estando todo en la misma maquina funciona genial, el problema es que he cogido el jar y lo he passado a otra maquina... y no va.
    me podrias guiar un poco? gracias

    ResponderEliminar
    Respuestas
    1. supongo que es un tema de configuracion del servidor glassfish verdad?

      Eliminar
  7. ummmm.... el lio esta al momento de la compilacion del cliente, como has consumido el WS con el cliente SE, lo mas probable es que tengas las referencias al WS como localhost, cambialas a la ip o nombre del equipo y recompila tu cliente SE, con eso debes poder ejecutarlo desde cualquier parte de la red, con alcanze claro a tu server.

    ResponderEliminar
    Respuestas
    1. he cambiada y nada de nada! sigue sin tener acceso, el glassfish no se deve configurar para que lleguen peticiones de otras maquinas?

      Eliminar
    2. intento acceder al test del webservices y sale esto:

      HTTP Status 404 -

      type Status report

      message

      descriptionThe requested resource () is not available.

      GlassFish Server Open Source Edition 3.1.2

      Eliminar
    3. ummm... verifica el puerto de publicacion en glassfish para luego abrir el puerto en el equipo donde esta el WS, puede ser problema de tu firewall, luego solicita el test desde el equipo bajo ip y no como localhost, y has lo mismo desde el equipo que lo va a consumir... superado esto ya debería correr

      Eliminar
    4. solucion error 500 glassfish
      http://wiki.netbeans.org/FaqWSDLExternalSchema

      Eliminar
    5. solucion error 500 glassfish
      http://wiki.netbeans.org/FaqWSDLExternalSchema

      Eliminar