Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Definir a ordem em que as validações serão realizadas

Olá, prezados colegas.

Na aula foi proposta a implementação da "Lista de Validadores" na classe "Service":

// Código omitido

@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;

// Código omitido

validadores.forEach(v -> v.validar(dados));


No caso, existe algum meio ou procedimento para garantir que as validações respeitem uma ordem definida?

Por exemplo, por alguma necessidade de negócio talvez seja importante validar primeiro o médico, depois o paciente e por último a consulta.

Obrigado.

2 respostas
solução!

Olá!

Por padrão, o Spring não garante uma ordem específica ao injetar uma lista de componentes, como é o caso dos validadores que você mencionou. No entanto, você pode definir explicitamente a ordem das validações utilizando a anotação @Order.

Aqui está um exemplo de como você pode fazer isso:

  1. Anote cada classe de validador com @Order:

    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    @Component
    @Order(1)
    public class ValidadorMedico implements ValidadorAgendamentoDeConsulta {
        // Implementação do validador
    }
    
    @Component
    @Order(2)
    public class ValidadorPaciente implements ValidadorAgendamentoDeConsulta {
        // Implementação do validador
    }
    
    @Component
    @Order(3)
    public class ValidadorConsulta implements ValidadorAgendamentoDeConsulta {
        // Implementação do validador
    }
    
  2. Injeção na classe Service:

    Quando você injetar a lista de validadores, o Spring irá respeitar a ordem definida pelas anotações @Order.

    @Autowired
    private List<ValidadorAgendamentoDeConsulta> validadores;
    

Com essa abordagem, os validadores serão executados na ordem que você especificar usando as anotações @Order. Lembre-se de que a ordem começa a partir de 1, e você pode ajustar conforme necessário para atender às suas necessidades de negócio.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Sim, é totalmente possível e, em muitos casos, necessário garantir a ordem de execução dos validadores. A maneira como o Spring injeta uma lista de beans, como private List validadores, não garante uma ordem específica por padrão.

Para controlar essa ordem, você pode usar as seguintes estratégias no Spring:

  1. Usando a anotação @Order
    A forma mais simples e direta de definir a ordem é usando a anotação @Order em cada um dos seus validadores. O Spring respeitará essa ordem ao injetar a lista de beans.

Você deve usar um número inteiro para a anotação, onde números menores têm prioridade maior.

Exemplo: import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1) // Executa primeiro
public class ValidadorMedico implements ValidadorAgendamentoDeConsulta {
// Implementação da validação do médico
}

@Component
@Order(2) // Executa em segundo
public class ValidadorPaciente implements ValidadorAgendamentoDeConsulta {
// Implementação da validação do paciente
}

@Component
@Order(3) // Executa por último
public class ValidadorConsulta implements ValidadorAgendamentoDeConsulta {
// Implementação da validação da consulta
}