Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

@Component em classes abstratas?

@Component pode ser usado em classes abstratas? se eu quiser que as validaçoes sejam feitas em etapas ordenadas como seria?

1 resposta
solução!

Olá, Luccas!

Sim, você pode usar a anotação @Component em classes abstratas no Spring. No entanto, é importante entender que uma classe abstrata anotada com @Component não será instanciada diretamente pelo Spring, pois classes abstratas não podem ser instanciadas. O propósito de anotar uma classe abstrata com @Component é para que suas subclasses concretas possam herdar essa anotação e serem gerenciadas pelo Spring.

Para o seu caso específico, onde você deseja que as validações sejam feitas em etapas ordenadas, você pode usar a anotação @Order do Spring para especificar a ordem em que os componentes devem ser processados. Aqui está um exemplo prático de como você pode fazer isso:

  1. Defina a interface de validação:
public interface ValidadorAgendamentoDeConsulta {
    void validar(DadosAgendamentoConsulta dados);
}
  1. Crie uma classe abstrata que implemente a interface e anote-a com @Component:
@Component
public abstract class ValidadorAgendamentoDeConsultaBase implements ValidadorAgendamentoDeConsulta {
    // Métodos comuns de validação podem ser definidos aqui
}
  1. Crie classes concretas que estendam a classe abstrata e use a anotação @Order para definir a ordem:
@Component
@Order(1)
public class ValidadorHorarioAntecedencia extends ValidadorAgendamentoDeConsultaBase {
    @Override
    public void validar(DadosAgendamentoConsulta dados) {
        // Implementação da validação
    }
}

@Component
@Order(2)
public class ValidadorMedicoAtivo extends ValidadorAgendamentoDeConsultaBase {
    @Autowired
    private MedicoRepository repository;

    @Override
    public void validar(DadosAgendamentoConsulta dados) {
        // Implementação da validação
    }
}
  1. Na sua classe de serviço (AgendadeConsultas), injete a lista de validadores:
@Service
public class AgendadeConsultas {

    @Autowired
    private List<ValidadorAgendamentoDeConsulta> validadores;

    public void agendar(DadosAgendamentoConsulta dados) {
        validadores.forEach(v -> v.validar(dados));
        // Resto do código de agendamento
    }
}

Com essa abordagem, o Spring irá garantir que os validadores sejam executados na ordem especificada pelas anotações @Order.

Espero ter ajudado e bons estudos!