Paso 2: CRUD Editorial - Explicación del código

Para invocar el servicio construya la petición:

GET urlservidor/api/editorials/1

Donde urlservidor en nuestros ejemplos corresponde:

localhost:8080/backstepbystep-web

El número 1 debe corresponder al id de una editorial que existe. Si no existe debe enviar el mensaje de que la editorial con el id dado no existe.

Persistencia

La clase EditorialPersistence utiliza un objeto EntityManager (em) para acceder a la base de datos. Este objeto debe estar anotado con el PersistenceContext como se muestra en el siguiente código:

@Stateless public class EditorialPersistence { private static final Logger LOGGER = Logger.getLogger(EditorialPersistence.class.getName()); @PersistenceContext(unitName = "BookStorePU") protected EntityManager em; ... }

1) Algunos de los métodos de EditorialPersistence pueden utilizar métodos predefinidos para hacer el llamado, como por ejemplo el método:

find(Class<T> entityClass, Object primaryKey) Ver documentación aquí

public EditorialEntity find(Long id) { LOGGER.log(Level.INFO, "Consultando editorial con id={0}", id); /* Note que se hace uso del metodo "find" propio del EntityManager, el cual recibe como argumento el tipo de la clase y el objeto que nos hara el filtro en la base de datos en este caso el "id" Suponga que es algo similar a "select * from EditorialEntity where id=id;" - "SELECT * FROM table_name WHERE condition;" en SQL. */ return em.find(EditorialEntity.class, id); } {%endace} 2) Otros métodos, deben construir explícitamente un query para acceder a la base de datos, por ejemplo: {%ace edit=true, lang='java'%} public List<EditorialEntity> findAll() { LOGGER.info("Consultando todas las editoriales"); // Se crea un query para buscar todas las editoriales en la base de datos. TypedQuery query = em.createQuery("select u from EditorialEntity u", EditorialEntity.class); // Note que en el query se hace uso del método getResultList() que obtiene una lista de editoriales. return query.getResultList(); }

Lógica

Las responsabilidades de la lógica consisten en verificar las reglas de negocio y si no se cumplen disparar BusinessLogicExceptioncon el mensaje apropiado.

Si las reglas de negocio se cumplen la lógica debe invocar a los métodos de la capa de persistencia.

API REST

La siguiente figura muestra los métodos (servicios) HTTP que hemos definido en este paso en la clase EditorialResource.

Cada método está anotado por uno de los verbos HTTP. EN el paso-1 vimos que el método create tiene la anotación @POST.

Verbo HTTP PATH Método en EditorialResource
@POST editorials createEditorial
@GET editorials getEditorials
@GET editorials/{id} getEditorial
@DELETE editorials/{id} deleteEditorial
@PUT editorials/{id} updateEditorial

Todos los métodos que tienen id que representa el identificador del libro deben:

1) Declarar el parámetro que contiene el valor del id y anotarlo con @PATHPARAM:

.. @GET @Path("{id: \\d+}") public EditorialDetailDTO getEditorial(@PathParam("id") Long id) throws BusinessLogicException { EditorialEntity entity = editorialLogic.getEditorial(id); if (entity == null) { throw new WebApplicationException("El recurso /editorials/" + id + " no existe.", 404); } return new EditorialDetailDTO(editorialLogic.getEditorial(id)); } ...

La expresión {id: \d+} significa que en la url vendrá una cadena de 1 o más dígitos que llamaremos id y que declaramos como parámetro de tipo Long.

GET urlservidor/api/editorials/123 : invocamos el servicio para obtener la editorial cuyo identificador es 123

2) Verificar que efectivamente este recurso exista:

.. EditorialEntity entity = editorialLogic.getEditorial(id); if (entity == null) { throw new WebApplicationException("El recurso /editorial/" + id + " no existe.", 404); } ..

results matching ""

    No results matching ""