Olá, pessoal
Pautado na ideia de "Lista de Validadores" dessa aula, estava pensando numa forma de se aproveitar alguns validadores em contexto distintos.
Por exemplo, vamos imaginar a classe de domínio "MOTORISTA" (tabela motoristas no banco de dados), para a qual criei os records "CriacaoMotoristaDto" e "AlteracaoMotoristaDto":
public record CriacaoMotoristaDto (
Integer id,
@NotNull
String cdCpfMotorista,
@NotNull
@JsonFormat(pattern = "dd/MM/yyyy")
LocalDate dtNascimento,
@NotBlank
String nmMotorista,
@NotNull
String cdCnhMotorista,
@NotBlank
String cdCategoriaCnhMotorista,
@NotNull
Boolean exerceAtividadeRemunerada,
@Not Null
@JsonFormat(pattern = "dd/MM/yyyy")
LocalDate dtValidadeCnhMotorista
) {}
public record AlteracaoMotoristaDto (
@NotNull
Integer id,
String cdCpfMotorista,
@JsonFormat(pattern = "dd/MM/yyyy")
LocalDate dtNascimento,
String nmMotorista,
String cdCnhMotorista,
String cdCategoriaCnhMotorista,
Boolean exerceAtividadeRemunerada,
@JsonFormat(pattern = "dd/MM/yyyy")
LocalDate dtValidadeCnhMotorista
) {}
Na inclusão de motorista, todos os campos são preenchidos.
Na alteração de motorista, serão preenchidos apenas os campos que se desejam alterar, omitindo aqueles que se deseja manter o conteúdo já armazenado. Contudo, a validação deve ser feita na totalidade para que a nova informação seja compatível com as demais.
Um dado motorista pode receber a condição de "Exercer atividade remunerada", mas para que esta mudança seja aceita, a Data de Validade da CNH presente na base ainda esteja vigente, por exemplo.
public class MotoristaService {
@Autowire
private List<ValidadorNovoMotorista> validadoresNovo;
@Autowire
private List<ValidadorMotoristaExistente> validadoresExistente;
public void cadastrar(CriacaoMotoristaDto dados) {
validadoresNovo.forEach(v -> v.validar(dados);
// demais procedimentos para "Inclusão de Novo Motorista"
}
public void alterar(AlteracaoMotoristaDto dados) {
validadoresExistente.forEach(v -> v.validar(dados);
// demais procedimentos para "Alteração de Motorista Existente"
}
}
Como seria possível para o mesmo validador seja reaproveitado, sem duplicar?
public class ValidadorDataValidadeCnh implements ValidadorNovoMotorista, ValidadorMotoristaExistente{
public void validar(????????????? dados) { // Qual seria o tipo?
if(dados.dtValidadeCnhMotorista.isBefore(LocalDate.now())) {
throw new ValidacaoException("Data de Validade CNH está expirada.");
}
}