Tutorial Java Web: JSF + Hibernate + BootsFaces [Parte 6: Construyendo la Capa de Servicios]

Miguel Manjarres
5 min readJun 19, 2020

--

Hola 👋 y bienvenido a la sexta parte de este tutorial en el que construiremos nuestra propia aplicación de tareas en JSF. En el tutorial anterior concluimos la construcción de la capa de persistencia, que nos permitirá guardar nuestros objetos en la base de datos. El objetivo de este tutorial es construir una capa adicional de servicios también conocida como capa de lógica de negocio en la que la idea principal es consumir los métodos que definimos en nuestros repositorios.

Para comenzar, abre el proyecto JSFTutorial en tu IDE Eclipse, en la carpeta source de tu código Java crea un nuevo paquete llamado services, en él crea una clase llamada UsuarioService (de nuevo, el nombre puede ser cualquiera que desees, pero es mejor atenerse a la convención de nombres), tal que así:

Ya que las clases que conforman la capa de servicios básicamente lo que hacen es establecer un puente a través de los métodos de la clase, es conveniente limitar las veces en la que se puede instanciar un objeto de la misma, para no desperdiciar recursos. Esto lo podemos hacer aplicando el patrón de diseño Singleton, hay muchas formas de implementarlo, pero la más sencilla es crear una instancia constante y privada de la clase llamado Instance y retornarlo a través de un método, tal que así:

Nota que también hemos creado una nueva instancia estática de nuestro repositorio, eso es porque la usaremos en los métodos que crearemos a continuación. Por cada método que existe en el repositorio, crea un método con la misma firma en el servicio y retorna lo que sea que retorne el la función en el repositorio (si es que retorna algo), tal que así:

Sé que al principio esto puede parecerte un poco rebuscado y hasta innecesario (a mí me pasó 😣), pero observa que ahora podemos definir cualquier transformación sobre el objeto antes y/o después de efectuar la operación en la base de datos. Podemos por ejemplo:

  • Verificar que el objeto que nos está llegando no es nulo
  • Agregar o quitar una propiedad dinámicamente antes de ingresar el objeto o después de que ha sido devuelto
  • Hacer una copia del objeto antes de que lo borremos, para restaurarlo solo en caso de que el usuario se arrepienta después

Y eso sólo por darte algunas ideas. Sí recuerdas, nuestra tabla users guarda la fecha de creación del usuario, ¿Qué mejor lugar para crear ese dato que justo antes de guardar el objeto?

Aquí te dejo el código de la clase completo, siéntete libre de copiar y pegar esto a tu proyecto y te animo a aplicar alguna de las ideas que mencioné más arriba:

El proceso de creación para la clase TareaService es exactamente el mismo excepto por el método save(). Recuerda que una tarea necesariamente debe tener anclado un usuario, por lo tanto al momento de guardar una tarea, debes pasar dicho usuario como parámetro y ponerlo como dueño de la tarea así como agregar la tarea a la lista de tareas del usuario y guardar ambas entidades, tal que así:

Como ejercicio puedes implementar una rutina que verifique que el usuario exista en la base de datos antes de guardar la tarea, confío en que puedes implementar el resto tu mismo 😉.

Para terminar y verificar que todo esté funcionando correctamente, dirígete a tu clase App (aquella que creamos en el tutorial número 5.1) y reemplaza el código dentro de tu método main por el siguiente:

Y ejecuta tu proyecto como una aplicación Java (recuerda tener encendido tu motor de SQL), los siguientes mensajes se mostrarán en tu consola:

Y si revisas tu base de datos verás que, efectivamente, tanto el usuario como la tarea se han guardado como nuevos registros en sus respectivas tablas, justo como antes, pero ahora tenemos un código mucho más conciso y mejor organizado.

¡Felicidades 🥳! con esto has terminado satisfactoriamente la capa de servicios (al menos por ahora) y ya estamos listos para entrar en territorio de JSF como tal, en los controladores y la capa de presentación, ¿estás emocionado? ¡espero que sí! Muchas gracias por leer hasta aquí y espero verte en una próxima ocasión.

Si te gustó el tutorial y quieres apoyarme para seguir creando más contenido así puedes hacerme una donación aquí.

Bonus

Aunque no es necesario para el funcionamiento de la aplicación, se recomienda crear una interfaz para los servicios con los métodos que vamos a utilizar. Imagina que estás trabajando en una gran aplicación y hay dos equipos, uno que se encarga del front-end y otro del back-end, los del front-end necesitan usar los métodos de manipulación de datos que los servicios ofrecen, entonces por medio de la interfaz ellos pueden usar los métodos sin que estos estén necesariamente implementados, ¿genial no?

Para lograr esto, crea una interfaz en tu paquete services con el nombre de IUsuarioService y crea en ella los métodos que implementamos en nuestra clase, tal que así:

Luego implementa la interfaz en tu clase UsuarioService, no deberia haber ningun error, repite el proceso para la clase TareaService.

Tutorial anterior: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-9a786919ab14

Tutorial siguiente: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-355867ca767e

--

--

Miguel Manjarres

Ingeniero de Software con experiencia en desarrollo de aplicaciones web y de escritorio