POST /books/{bookId}/authors/{authorId}

Asocia un objeto author a un objeto book

Parámetros

Nombre Ubicación Descripción Requerido Esquema
bookId PathParam ID del objeto book al cual se asociará el objeto author Integer
authorId PathParam ID del objeto author a asociar Integer

Respuesta

Código Descripción Cuerpo
200 Objeto author asociado Representación basic de author
500 No se pudo asociar el objeto author

Llamada al servicio en AngularJS

Este servicio actualmente no es usado por el frontend.

JAX-RS recibe la petición en un String con formato JSON

Una vez el front envía la petición, el servlet de JAX-RS la recibe. Basándose en la URL solicitada (/books/´{bookId}/authors/{authorId}), y en el método HTTP (POST), JAX-RS busca una clase con la anotación @Path('books') y que tenga un método con las anotaciones @POST y @Path("{bookId: \\d+}/authors/{authorId: \\d+}")'), el cual será ejecutado para responder a la solicitud.

@Path("books")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class BookResource {

    // ...

    @POST
    @Path("{bookId: \\d+}/authors/{authorId: \\d+}")
    public AuthorDTO addAuthors(@PathParam("bookId") Long bookId, @PathParam("authorId") Long authorId) {
        // ...
    }

    //...
}

Invocación de API de lógica

Para la invocación de la lógica, se inyectó una instancia de IBookLogic, cuya inicialización es resuelta por el contenedor:

@Inject
private IBookLogic bookLogic; // Inyección de instancia de IBookLogic

@POST
@Path("{bookId: \\d+}/authors/{authorId: \\d+}")
public AuthorDTO addAuthors(@PathParam("bookId") Long bookId, @PathParam("authorId") Long authorId) {
    AuthorEntity author = bookLogic.addAuthor(bookId, authorId);
    return AuthorConverter.fullEntity2DTO(author);
}

Esta implementación ejecuta los siguientes pasos:

  1. Consulta el objeto book con ID igual a bookId.
  2. Consulta el objeto author con ID igual a authorId.
  3. Añade a los autores del objeto book una referencia al objeto author.
  4. Retorna el objeto author que fue asociado con el objeto book.
@Inject
private BookPersistence persistence;

@Override
public AuthorEntity addAuthor(Long authorId, Long bookId) {
    BookEntity bookEntity = persistence.find(bookId);
    AuthorEntity authorEntity = authorPersistence.find(authorId);
    bookEntity.getAuthors().add(authorEntity);
    return authorEntity;
}

Dado que la asociación se hace a través de la entidad, no es necesario invocar a la capa de persistencia. JPA ya hace la actualización de la base de datos al añadir el objeto author a la colección de autores de book, y esta trasacción persiste automáticamente cuando el contenedor hace commit.

Retorno de la respuesta

Una vez el servicio recibe la respuesta de la lógica, necesita serializarla en formato JSON para poder transmitirla con el protocolo HTTP. Aquí es donde JAX-B entra en acción. Este puede serializar los DTO a JSON, mapeando los atributos del objeto DTO a propiedades del objeto JSON. Así, cada método accesor (getter) es mapeado a una propiedad del JSON. En este caso, author quedaría como un objeto JSON, donde cada propiedad accesible con un get, está disponible como atributo del JSON.

results matching ""

    No results matching ""