Definição de DTOs
DTOs, ou Objetos de Transferência de Dados, são estruturas utilizadas para encapsular dados em operações de rede, servindo como uma camada de abstração que separa a lógica de domínio da apresentação dos dados. Eles são cruciais para garantir que a interface externa da API seja desacoplada da estrutura interna de modelos de domínio.
Exemplo Simples de DTO
package com.webpublico.ead.api.dto.academico;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.webpublico.ead.api.dto.BaseDTO;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@id")
public class TopicoDTO extends BaseDTO {
@NotBlank
@Size(max = 500)
private String titulo;
@NotBlank
private String descricao;
private String nivelAnteriorTopicoId;
}
Exemplo "Complexo" com Lista
package com.webpublico.ead.api.dto.academico;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.webpublico.ead.api.dto.BaseDTO;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "@id")
public class TopicoDTO extends BaseDTO {
@NotBlank
@Size(max = 500)
private String titulo;
@NotBlank
private String descricao;
private String nivelAnteriorTopicoId;
private List<DisciplinaDTO> disciplinas;
}
Pontos Importantes sobre DTOs
-
Herança de BaseDTO: Todos os DTOs devem herdar de
BaseDTO, que pode incluir identificadores e outros campos comuns essenciais para a interoperabilidade e o rastreamento de objetos em toda a aplicação. -
Listas em DTOs: As listas nos DTOs são utilizadas estritamente para a recepção de dados em operações de POST e PUT. Para devolver coleções de entidades relacionadas, utiliza-se endpoints específicos, garantindo assim que o carregamento de dados seja feito de maneira eficiente e controlada.
-
Validações: As validações em DTOs usam anotações como
@NotBlanke@Sizepara garantir que os dados recebidos estejam conforme as expectativas e regras de negócio antes de serem processados pela aplicação. As mensagens de erro das validações são definidas no arquivomessages.properties, localizado na pastaresources, o que facilita a internacionalização e personalização das mensagens. -
JsonIdentityInfo: Esta anotação é utilizada para lidar com a serialização de identidades de objeto, útil em casos de relações bidirecionais ou recursivas, evitando loops infinitos na serialização JSON.
-
Separação de preocupações: Utilizar DTOs permite que as alterações na lógica de domínio não afetem diretamente os contratos da API, facilitando manutenções e evoluções do sistema sem impactar os consumidores da API.
A utilização adequada de DTOs é fundamental para o desenho de APIs robustas e escaláveis, permitindo uma clara separação entre a camada de apresentação e a lógica de negócio, além de proporcionar uma segurança adicional ao validar e adaptar os dados recebidos antes de proceder com operações de negócio.