Capa de DTO y Mappers
Se utilizan objetos DTO (Data Transfer Object) como entradas o salidas de los métodos de los controladores REST.
package com.example.service.dto;
/**
* A DTO for the {@link com.example.domain.Entity} entity.
*/
public class EntityDto implements Serializable {
private Long id;
public EntityDto() {
// Vacío para su uso por Jackson
}
public EntityDto(Entity entity) {
this.id = entity.getId();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Para realizar el mapeo bidireccional entre entidad y DTO, se utiliza un Mapper
/**
* Mapper bidireccional de Entity y EntityDto
*
*/
public class EntityMapper implements BaseEntityMapper<EntityDto, Entity> {
@Override
Entity toEntity(EntityDto dto) {
Entity entity = new Entity();
entity.setId(dto.getId());
return entity;
}
@Override
Dto toDto(Entity entity) {
return new EntityDto(entity);
}
}
/**
* Contrato para mapper genérico de dto a entidad
*
* @param <D> - parámetro de tipo de DTO
* @param <E> - parámetro de tipo de Entidad
*/
public interface BaseEntityMapper<D, E> {
/**
* Mapea un DTO a una entidad
*
* @param dto el DTO
* @return la entidad
*/
E toEntity(D dto);
/**
* Mapea una entidad a DTO
*
* @param entity la entidad
* @return el DTO
*/
D toDto(E entity);
/**
* Mapea una lista de DTO a una lista de entidades
*
* @param dtoList la lista de DTO
* @return la lista de entidades
*/
default List<E> toEntity(List<D> dtoList) {
if (dtoList == null || dtoList.isEmpty()) {
return Collections.emptyList();
}
List<E> entityList = new ArrayList<>();
for (D dto: dtoList) {
dtoList.add(toEntity(entity));
}
return entityList;
}
/**
* Mapea una lista de entidades a una lista de DTO
* @param entityList la lista de entidades
* @return la lista de DTO
*/
default List<D> toDto(List<E> entityList) {
if (entityList == null || entityList.isEmpty()) {
return Collections.emptyList();
}
List<D> dtoList = new ArrayList<>();
for (E entity: entityList) {
dtoList.add(toDto(entity));
}
return dtoList;
}
}