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 | Sí | Integer |
authorId | PathParam | ID del objeto author a asociar | Sí | 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:
- Consulta el objeto book con ID igual a
bookId
. - Consulta el objeto author con ID igual a
authorId
. - Añade a los autores del objeto book una referencia al objeto author.
- 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.