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
EntityManager
para 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.xml
define las propiedades de la base de datos asociada con este nombre (localización, puerto, nombre físico, etc.). - 5) El método
create
que 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
persist
delEntityManager
. Este método recibe la entidad y devuelve la entidad con el nuevoid
asignado porque así lo definimos en la claseEditorialEntity
.
- 7) La clase
EditorialPersistence
también tiene definido el métodofindByName
que retornanull
si 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).