1
resposta

[Dúvida] Erro validação

Estou realizando a aula 3 do curso de API Spring e estou me deparando com o seguinte problema:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'consultaController': Unsatisfied dependency expressed through field 'agenda': Error creating bean with name 'agendaDeConsultas': Unsatisfied dependency expressed through field 'consultaRepository': Error creating bean with name 'consultaRepository' defined in med.voll.api.domain.consulta.ConsultaRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoAndData(java.lang.Long,java.time.LocalDateTime); Reason: Failed to create query for method public abstract boolean med.voll.api.domain.consulta.ConsultaRepository.existsByMedicoAndData(java.lang.Long,java.time.LocalDateTime); Can't compare test expression of type [Medico] with element of type [basicType@5(java.lang.Long,-5)]

Essa são minhas classes :

Medico repositorio:

public interface MedicoRepository extends JpaRepository<Medico, Long> {

    Page<Medico> findAllByAtivoTrue(Pageable paginacao);

    @Query(value = "SELECT * FROM medicos m " +
            "WHERE m.ativo = 1 " +
            "AND m.especialidade = :especialidade " +
            "AND m.id NOT IN (SELECT c.medico_id FROM consultas c WHERE c.data = :data) " +
            "ORDER BY RANDOM() LIMIT 1", nativeQuery = true)
    Medico escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

    @Query(value = "SELECT * FROM medico m" +
            "WHERE m.ativo = 1" +
            "WHERE m.id = :id")
    Boolean findAtivoById(Long id);
}

Validador médicoComConsulta:

import org.springframework.stereotype.Component;

@Component
public class ValidadorMedicoComConsulta implements ValidadorAgendamento {
    @Autowired
    private ConsultaRepository consultarepository;

    public void validar (AgendamentoDaConsulta dados) {
        var medicoPossuiOutraConsulta = consultarepository.existsByMedicoAndData(dados.idMedico(), dados.data());

        if(medicoPossuiOutraConsulta) {
            throw new ValidacaoExcepetion("Médico já possui consulta!");
        }
    }

}
1 resposta

Olá, Felipe! Pelo que pude entender, você está enfrentando um problema na criação de beans com o Spring. O erro que você está vendo geralmente ocorre quando o Spring não consegue criar um bean por algum motivo. No seu caso, parece que o problema está na criação do bean 'consultaRepository'.

O erro está indicando que não pode criar a query para o método existsByMedicoAndData porque não pode comparar uma expressão do tipo [Medico] com um elemento do tipo [Long]. Isso pode ser porque o Spring está esperando um objeto do tipo Medico, mas está recebendo um Long.

Uma possível solução para isso seria alterar o método existsByMedicoAndData para receber um objeto Medico em vez de um Long. Você poderia fazer isso buscando o Medico pelo id antes de chamar o método existsByMedicoAndData. Veja um exemplo de como ficaria:

public void validar (AgendamentoDaConsulta dados) {
    Medico medico = medicoRepository.findById(dados.idMedico()).orElseThrow(() -> new ValidacaoExcepetion("Médico não encontrado!"));
    
    var medicoPossuiOutraConsulta = consultarepository.existsByMedicoAndData(medico, dados.data());

    if(medicoPossuiOutraConsulta) {
        throw new ValidacaoExcepetion("Médico já possui consulta!");
    }
}

Nesse exemplo, estou assumindo que você tem um medicoRepository autowired no seu validador. Se não tiver, você precisará adicioná-lo. Lembre-se de que essa é apenas uma sugestão e pode não resolver totalmente o seu problema, pois pode haver outros problemas no seu código que não estão visíveis na pergunta.

Espero ter entendido e conseguido ajudar. Qualquer coisa manda aqui de novo. Bons estudos!