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

[Dúvida] Erro de inicialização

Obtive o seguinte erro após implementar o método de escolha de médico aleatório:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-09-26T09:52:30.836-03:00 ERROR 17576 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field medico in Voll.med.Primeira.Api.domain.consultas.AgendamentoDeConsulta required a bean of type 'Voll.med.Primeira.Api.domain.medicos.Medico' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'Voll.med.Primeira.Api.domain.medicos.Medico' in your configuration.

Código da classe AgendamentoDeConsulta:

package Voll.med.Primeira.Api.domain.consultas;

import Voll.med.Primeira.Api.domain.medicos.Medico;
import Voll.med.Primeira.Api.domain.medicos.MedicoRepository;
import Voll.med.Primeira.Api.domain.pacientes.Paciente;
import Voll.med.Primeira.Api.domain.pacientes.PacienteRepository;
import Voll.med.Primeira.Api.infra.exception.ValidacaoException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AgendamentoDeConsulta {

    @Autowired
    private ConsultaRepository consultaRepository;
    @Autowired
    private Medico medico;
    @Autowired
    private Paciente paciente;

    @Autowired
    private MedicoRepository medicoRepository;
    @Autowired
    private PacienteRepository pacienteRepository;

    public void Agendamento(DadosAgendamentoDeConsulta dados){

        if (!pacienteRepository.existsById(dados.idPaciente())){
            throw new ValidacaoException("Paciente inexistente!");
        }
        if (dados.idMedico() != null && !medicoRepository.existsById(dados.idPaciente())){
            throw new ValidacaoException("Paciente inexistente!");
        }

        var paciente = pacienteRepository.findById(dados.idPaciente()).get();
        var medico = medicoRepository.findById(dados.idMedico()).get();

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

    }

    private Medico escolheMedico(DadosAgendamentoDeConsulta dados){
        if (dados.idMedico() != null){
            return medicoRepository.getReferenceById(dados.idMedico());
        }
        if (dados.especialidade() == null){
            throw new ValidacaoException("Especialida não informada ou invalída, por favor informe a especialidade da consulta corretamente");
        }
        return medicoRepository.escolherMedicoAleatorioDisponivelNaData(dados.especialidade(),dados.data());
    }
}
2 respostas
solução!

Oii, Lewy! Tudo bem?

O erro acontece porque o Spring não conseguiu injetar a instância Medico na sua classe AgendamentoDeConsulta.

Spring Boot não consegue criar uma instância de 'Medico' para injetar, pois 'Medico' é uma entidade, não um bean que pode ser gerenciado pelo Spring Boot.

Tendo como base o trecho do seu código, recomendo deletar a linha que é injetado Medico diretamente, pois no seu código já tem o MedicoRepository injetado. E quando for necessário, use-o para obter a instância Medico.

Outra alternativa é dizer ao Sprin como criar um Medico. Como sugestão, você pode usar a anotação como @Service ou @Component, ambos instrui ao Spring que Medico é algo que ele deve trabalhar.

Deixo o link da documentação do Spring Boot abaixo, é uma excelente ferramenta de apoio para expandir e consolidar seus conhecimentos.

Lembrando que as sugestões acima precisam ser testadas de acordo com o contexto do seu projeto, espero que uma delas te ajude.

Qualquer dúvida, compartilhe no fórum.

Bons estudos, Lewy!

Olá, Nathalia! Tudo bem? Obrigado pela sugestão e realmente deletar a injeção Medico ajudou na solução do meu problema. Mas o real problema mesmo é que o Spring não estava consultar a JPQL pois minha Query buscava por o atributo "ativo" e realmente não existia esse atributo no meu código, pois o nome do meu atributo era "ativos". Sim, passei horas procurando um erro e no final era apenas por causa de uma letra kkkkkk. Mas o importante é que funcionou!