Implementação do Validator
Os validadores são essenciais para nossa camada de serviço que ajudam a garantir a integridade dos dados antes de executar operações como salvar ou atualizar registros. Eles verificam se as entidades do domínio estão em um estado válido e conforme as regras de negócio definidas.
Exemplo de um Validador Básico
Aqui está um exemplo de um validador básico para a entidade Topico. Este validador checa se os atributos da entidade estão corretos e se não violam nenhuma regra de negócio:
package com.webpublico.ead.application.validator.academico;
import br.com.archbase.ddd.domain.contracts.ValidationResult;
import com.webpublico.ead.application.exception.RegraNegocioException;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class TopicoValidator extends BaseValidator<Topico> {
@Override
public void validar(Topico topico) {
ValidationResult validationResult = topico.validate();
if (!validationResult.isValid()) {
throw new RegraNegocioException(validationResult.getErrors());
}
}
}
Validador com Regras de Negócio Específicas
Para cenários que exigem validações específicas, como verificar a unicidade de um campo, podemos expandir nosso validador para incluir essas regras:
package com.webpublico.ead.application.validator.academico;
import br.com.archbase.ddd.domain.contracts.ValidationResult;
import com.webpublico.ead.application.exception.RegraNegocioException;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import com.webpublico.ead.domain.repository.academico.TopicoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class TopicoValidator extends BaseValidator<Topico> {
private final TopicoRepository repository;
@Override
public void validar(Topico topico) {
ValidationResult validationResult = topico.validate();
if (!validationResult.isValid()) {
throw new RegraNegocioException(validationResult.getErrors());
}
verificarExistenciaTitulo(topico);
}
private void verificarExistenciaTitulo(Topico topico) {
String titulo = topico.getTitulo();
boolean tituloJaCadastrado = repository.buscarTopicoPorTitulo(titulo)
.filter(topicoExistente -> !topicoExistente.equals(topico))
.isPresent();
if (tituloJaCadastrado) {
throw new RegraNegocioException(String.format("Já existe um tópico cadastrado com o título '%s'", titulo));
}
}
}
Uso de Validadores em Services
Os validadores são tipicamente invocados dentro dos métodos de services antes de realizar operações de persistência. Eles podem ser integrados em services que estendem BaseService ou em services personalizados. A herança de BaseService é opcional, mas oferece uma estrutura base que facilita a implementação de operações comuns e a integração com validadores.
Práticas Recomendadas
-
Implemente validadores mesmo se o serviço não herda de BaseService. Isso assegura que todas as entradas sejam validadas conforme as regras de negócio antes de qualquer operação.
-
Customize validadores conforme necessário para atender às exigências específicas do domínio.
-
Utilize
GetSecurityDatapara incluir dados de auditoria, garantindo que as operações sejam rastreadas corretamente.