1
resposta

[Dúvida] Uso de DTO para chamar o método validar()

Já que o método validar() não está recebendo nem enviando dados pra fora da API me pergunto se é necessário usar um DTO como parâmetro dele. Eu poderia usar a própria entidade como parâmetro para o método? Dessa forma:

public interface ValidacaoSolitacaoAdocao {

    void validar(Adocao adocao);

}
@Component
public class ValidadorSePetJaAdotado implements ValidacaoSolitacaoAdocao {

    @Override
    public void validar(Adocao adocao) {
        if(adocao.getPet().getAdotado()) {
            throw new ValidacaoException("Pet já foi adotado!");
        }
    }

}
@Service
public class AdocaoService {

    // ...código
    
    public void solicitar(AdocaoSolicitacaoDto adocaoSolicitacaoDto) {
        var tutor = tutorRepository.getReferenceById(adocaoSolicitacaoDto.idtutor());
        var pet = petRepository.getReferenceById(adocaoSolicitacaoDto.idPet());
        var adocao = new Adocao(tutor, pet, adocaoSolicitacaoDto.motivo());

        validacoes.forEach(v -> v.validar(adocao));

        adocao.setData(LocalDateTime.now());
        adocao.setStatus(StatusAdocao.AGUARDANDO_AVALIACAO);
        adocaoRepository.save(adocao);

        emailService.enviarEmail(adocao.getPet().getAbrigo().getEmail(),
                "Solicitação de adoção",
                "Olá " + adocao.getPet().getAbrigo().getNome()
                        + "!\n\nUma solicitação de adoção foi registrada hoje para o pet: "
                        + adocao.getPet().getNome() + ". \nFavor avaliar para aprovação ou reprovação.");
    }

    // código...
}

Assim também não haveria necessidade de repositórios nas classes de validação. Estaria correto dessa forma ou tem alguma desvantagem que não consegui enxergar?

1 resposta

Sim, a forma como você usou a entidade Adocao no método validar() está correta e é uma boa prática nesse caso específico. Vamos explicar isso de forma simples e direta:

Você pode usar a entidade diretamente no método validar()?

Sim, porque:

  • O método validar() não está expondo a entidade para o mundo externo.
  • Toda a lógica acontece dentro da camada de serviço, ou seja, dentro da API.
  • A entidade Adocao já foi montada e tem tudo o que a validação precisa.

Por que não usar o DTO na validação?

DTOs são feitos para comunicação externa: entrada ou saída de dados da API.

  • Dentro da API, especialmente entre serviço e validações internas, o uso da entidade é mais natural e direto.

  • Evita duplicação de lógica (ex: buscar dados do banco nas validações com base só no ID do DTO). Vantagens de usar a entidade Adocao na validação

  • Mais simples: evita que cada classe de validação tenha que injetar repositórios para buscar o Pet, Tutor, etc.

  • Mais coeso: tudo que a validação precisa já está disponível.

  • Menos acoplamento: as validações operam sobre um objeto pronto, não sobre pedaços de dados.

Tem alguma desvantagem?

Não. Desde que:

  • A entidade esteja completa no momento da validação (sem nulls inesperados).
  • Você mantenha o uso da entidade somente internamente, sem expor isso em controllers ou retornar pro cliente.

Sua abordagem está correta e segue boas práticas. Você evita repositórios nas validações e mantém a responsabilidade de montar a entidade no service, que é o lugar certo.

Pode seguir assim.