Paso 1: Crear Editorial - Explicación del código
Persistencia
Clase EditorialEntity
En este ejemplo simple, la clase EditorialEntity hereda de la clase BaseEntity que define el id identificador único del objeto en la base de datos. El atributo name está definido en la clase EditorialEntity. Como todas nuestras entidades tienen un identificador único lo hemos factorizado en la super clase BaseEntity. De la misma forma el método equals y hashcode que trabajan solo sobre el atributo id.
Clase EditorialPersistence
- 1) Es un EJB sin estado por esta razón se anota con
@Stateless. - 2) Define un
EntityManagerpara acceder a la base de datos. - 3) El debe estar anotado con @PersistenceContext y tener definido el atributo unitName.
- 4) El nombre lógico de la base de datos es "BookStorePU" (atributo unitName en línea 6) el archivo
persistence.xmldefine las propiedades de la base de datos asociada con este nombre (localización, puerto, nombre físico, etc.). - 5) El método
createque crea una entidad Editorial en la base de datos recibe la entidad como parámetro. La signatura es:
- 6) El método invoca el método
persistdelEntityManager. Este método recibe la entidad y devuelve la entidad con el nuevoidasignado porque así lo definimos en la claseEditorialEntity.
- 7) La clase
EditorialPersistencetambién tiene definido el métodofindByNameque retornanullsi no encuentra una editorial con el nombre pasado de argumento o retorna la entidad (la primera que encuentre) con el nombre dado.
Lógica
Clase EditorialLogic
Tiene el método createEditorial que recibe una EditorialEntity y devuelve la misma EditorialEntity solo que le ha asignado un id único (la persistencia).
El método primero valida la regla de negocio y si ya existe una editorial con el nombre igual al que se va a crear, dispara BusinessLogicException (línea 13 y 14). El mensaje es el que recibirá quien invocó el servicio.
Si no existe, llama a la capa de persistencia para que efectivamente cree la entidad en la base de datos (línea 16).
Clase BusinessLogicException
En nuestro diseño, cuando una regla de negocio validada por la capa de lógica no se cumple, disparamos la excepción BusinessLogicException con el mensaje adecuado para que sea entendido por el usuario final.
Para que JAX-RS pueda transformar esta excepción a un código HTTP definimos la clase BusinessLogicExceptionMapper que implementa la interface definida en JAX-RS ExceptionMapper<T>, donde T es la excepción que queremos procesar. ExceptionMapper<T> tiene por misión transformar una excepción en java en una respuesta HTTP (Response object) que viajará de regreso a quien invocó el servicio.
La clase debe tener definida la anotación @Provider para que JAX-RS la pueda procesar. El manual de referencia de JAX-RS, para más detalles, lo puede encontrar aquí.
@Provider
public class BusinessLogicExceptionMapper implements ExceptionMapper<BusinessLogicException> { ...}
La interface ExceptionMapper<T>define un único método que debe ser implementado:
Response toResponse(T exception)
En nuestro código la implementación del método, devuelve el objeto Response al que le asigna el código HTTP (412 PRECONDITION_FAILED) y devuelve el mensaje inicial que se envió cuando se disparó la excepción BusinessLogicException.
API Rest
Clase EditorialResource
Para implementar los servicios de acceso a los recursos Editorial, definimos la clase EditorialResource.
Cada clase recurso debe tener tres anotaciones:
- 1) @Path: indica como completar la url para acceder a los servicios asociados con este recurso (línea 1).
- 2) @Produces: que indica el tipo de datos que devolverán los servicios de este recurso. EN nuetsr ejemplo son JSON (línea 2).
- 3) @RequestScoped: Significa que se va a iniciar una transacción al comienzo de la ejecución de cualquier método definido en esta clase.
Adicionalmente, de acuerdo con nuestro diseño, los objetos de la clase recurso utilizan la capa de la lógica. En este caso definimos una variable EditorialLogic editorialLogic. Queremos que el objeto asociado con esta variable sea asignado por el contenedor, por esto anotamos esta variable con@Inject.
El método de creación de una editorial debe estar anotado con @POST. El método recibe el json enviado desde la invocación solo que aqui ya fue transformado por JAX-RS en un objeto de la clase EditorialDetailDTO. Note también que el método reenvia BusinessLogicException.
Este método debe invocar la capa de lógica a través de la variable editorialLogic. Como, de acuerdo con nuestro diseño, la capa de lógica solo sabe de objetos entities, antes de la invocación transformaos el DTO a Entity (línea 4) y después de la invocación transformamos el Entity a DTO (línea 4).