Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
18
respostas

Retornando erro "2023-06-13T11:31:39.779-03:00 ERROR 6744"

Ao tentar agendar uma consulta me retorna este erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

18 respostas

Oi Maessio!

Posta o texto do erro aqui, pois saiu cortado na imagem.

2023-06-13T15:16:11.742-03:00 ERROR 18268 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array] with root cause

org.hibernate.query.QueryTypeMismatchException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array

Parece ser erro na consulta sql. Posta aqui o código da sua interface MedicoRepository

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Está tudo certo com o código. Deve ter registros duplicados no seu banco de dados então, que foram inseridos como teste antes de realizar as validações.

Apaga as consultas do seu banco de dados:

delete from consultas;

Tabela de consultas já esta vazia Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Estranho. O erro acontece ao chamar o método existsByMedicoIdAndData da interface ConsultaRepository:

boolean existsByMedicoIdAndData(Long idMedico, LocalDateTime data);

Sendo que esse método é chamado nessa classe de validação:

@Component
public class ValidadorMedicoComOutraConsultaNoMesmoHorario implements ValidadorAgendamentoDeConsulta {

    @Autowired
    private ConsultaRepository repository;

    public void validar(DadosAgendamentoConsulta dados) {
        var medicoPossuiOutraConsultaNoMesmoHorario = repository.existsByMedicoIdAndData(dados.idMedico(), dados.data());
        if (medicoPossuiOutraConsultaNoMesmoHorario) {
            throw new ValidacaoException("Médico já possui outra consulta agendada nesse mesmo horário");
        }
    }
}

E a princípio somente aconteceria esse erro caso o médico tivesse mais de uma consulta nessa mesma data.

Verifiquei tanto a interface ConsultaRepository quanto a classe de validação e estão ambos corretas.

Faz um teste então, coloca um try/catch no validador, só para ter certeza que a exceção está ocorrendo nesse ponto do código mesmo:

public void validar(DadosAgendamentoConsulta dados) {
    try {
        var medicoPossuiOutraConsultaNoMesmoHorario = repository.existsByMedicoIdAndData(dados.idMedico(), dados.data());
        if (medicoPossuiOutraConsultaNoMesmoHorario) {
            throw new ValidacaoException("Médico já possui outra consulta agendada nesse mesmo horário");
        }
    } catch(Exception e) {
        System.out.println("Erro!");
        e.printStackTrace();
    }
}

Veja se ocorre o erro no console e posta aqui a saída do console.

Mesmo erro: 2023-06-13T16:30:43.841-03:00 ERROR 1076 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array] with root cause

Não passou pelo try/catch.

Hum, então é outro local.

Coloca o try/catch no método agendar da classe AgendaDeConsultas:

public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) {
    try {
        if (!pacienteRepository.existsById(dados.idPaciente())) {
            throw new ValidacaoException("Id do paciente informado não existe!");
        }

        if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
            throw new ValidacaoException("Id do médico informado não existe!");
        }

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

        var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
        var medico = escolherMedico(dados);
        if (medico == null) {
            throw new ValidacaoException("Não existe médico disponível nessa data!");
        }

        var consulta = new Consulta(null, medico, paciente, dados.data(), null);
        consultaRepository.save(consulta);

        return new DadosDetalhamentoConsulta(consulta);
    } catch(Exception e) {
        System.out.println("Erro!");
        e.printStackTrace();
        return null;
    }
}

Retornou Insira aqui a descrição dessa imagem para ajudar na acessibilidade

cola aqui a exception inteira

Erro!
org.springframework.orm.jpa.JpaSystemException: Specified result type [boolean] did not match Query selection type [med.voll.api.domain.consulta.Consulta] - multiple selections: use Tuple or array
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:320)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:232)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:550)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:134)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
    at jdk.proxy4/jdk.proxy4.$Proxy136.findAtivoById(Unknown Source)
    at med.voll.api.domain.consulta.Validacoes.ValidadorPacienteAtivo.validar(ValidadorPacienteAtivo.java:16)
    at med.voll.api.domain.consulta.AgendaDeConsultas.lambda$agendar$0(AgendaDeConsultas.java:44)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at med.voll.api.domain.consulta.AgendaDeConsultas.agendar(AgendaDeConsultas.java:44)
    at med.voll.api.controller.ConsultaController.agendar(ConsultaController.java:26)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)

Ah o problema está aqui na verdade:

at med.voll.api.domain.consulta.Validacoes.ValidadorPacienteAtivo.validar(ValidadorPacienteAtivo.java:16)

Manda aqui suas classes ValidadorPacienteAtivo e também PacienteRepository

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

O problema está na sua classe ValidadorPacienteAtivo. Você injetou nela o ConsultaRepository ao invés do PacienteRepository

Deu certo! Muito obrigado!!!