Converters y DTOs
Cuando se desarrolla un API REST, es importante diferenciar la representación del recurso de cualquier estructura de datos al interior de la aplicación.
Por ejemplo, en una aplicación financiera podría crearse un servicio que reciba los datos de un préstamo que desea el usuario y el sistema responda las cuotas que debe pagar. Esta es información que no se encuentra en base de datos (sino que es un resultado de un cálculo) y la respuesta tiene una estructura diferente. Por esta razón se crean los DTO, los cuales definen la estructura de los datos a transmitir por el API REST.
Data Transfer Objects
Como puede observar, los métodos (los servicios de negocio del módulo Book) reciben como parámetro y retorna como resultado objetos de la clase BookDTO. Esta estructura de datos corresponde a los atributos privados de la clase Book y sus correspondientes setters y getters.
package co.edu.uniandes.csw.bookstore.dtos;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
import java.util.ArrayList;
@XmlRootElement
public class BookDTO {
private Long id;
private String name;
private String description;
private String isbn;
private String image;
private List<AuthorDTO> authors = new ArrayList<>();
private EditorialDTO editorial;
/*
* Getters y Setters
*/
}
El ejemplo BookStore tiene DTOs muy similares a las entidades de base de datos dado que es un sistema de operaciones CRUD. Sin embargo, se realiza la definición en diferentes estructuras ya que más adelante podrían presentarse cambios en unos, y estos no deberían impactar los otros.
Converter
Dada la cantidad de datos que se transmiten en los DTO y su similitud con los Entity, se crean dos métodos para hacer conversiones de DTO a Entity y de Entity a DTO. El ejemplo de esto métodos para la conversión se puede ver a continuación:
.
.
.
public BookDTO(BookEntity entity) {
if (entity!=null){
this.id=entity.getId();
this.name=entity.getName();
this.description=entity.getDescription();
this.isbn=entity.getIsbn();
this.image=entity.getImage();
}
}
/**
* Convierte un objeto BookDTO a BookEntity.
*
* @return Nueva objeto BookEntity.
* @generated
*/
public BookEntity toEntity() {
BookEntity entity = new BookEntity();
entity.setId(this.getId());
entity.setName(this.getName());
entity.setDescription(this.getDescription());
entity.setIsbn(this.getIsbn());
entity.setImage(this.getImage());
return entity;
}
.
.
.