3
respostas

Erro ao não enviar o ID do médico

Quando não mandasse o id do médico era pra ele retornar uma mensagem dizendo para passar a especialidade, mas no meu não funciona nem um e nem outro, os dois dão erro 403 e mandam o seguinte erro no console:

2024-07-12T10:36:31.352-03:00 ERROR 18612 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null] with root cause

java.lang.IllegalArgumentException: The given id must not be null at org.springframework.util.Assert.notNull(Assert.java:204) ~[spring-core-6.0.2.jar:6.0.2]

segue a classe AgendaDeConsultas:

package med.voll.api.domain.consulta;

import med.voll.api.controller.DadosCancelamentoConsulta; import med.voll.api.domain.ValidacaoException; import med.voll.api.domain.consulta.validacoes.ValidadorAgendamentoDeConsulta; import med.voll.api.domain.medico.Medico; import med.voll.api.domain.medico.MedicoRepository; import med.voll.api.domain.paciente.PacienteRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import java.util.List;

@Service public class AgendaDeConsultas {

@Autowired
private ConsultaRepository consultaRepository;

@Autowired
private MedicoRepository medicoRepository;

@Autowired
private PacienteRepository pacienteRepository;

@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;

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

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

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

    var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
    var medico = medicoRepository.findById(dados.idMedico()).get();
    if (medico == null){
        throw new ValidacaoException("Não existe médico disponivel para essa data!");
    }
    var consulta = new Consulta(null, medico, paciente, dados.data(), null);
    consultaRepository.save(consulta);

    return new DadosDetalhamentoConsulta(consulta);
}

private Medico escolherMedico(DadosAgendamentoConsulta dados){
    if (dados.idMedico() != null){
        return medicoRepository.getReferenceById(dados.idMedico());
    }

    if (dados.especialidade() == null){
        throw new ValidacaoException("Especialidade é obrigatória quando o médico não é escolhido!");
    }

    return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());
}

public void cancelar(DadosCancelamentoConsulta dados) {
    if (!consultaRepository.existsById(dados.idConsulta())){
        throw new ValidacaoException("Id da consulta não existe!");
    }
    var consulta = consultaRepository.getReferenceById(dados.idConsulta());
    consulta.cancelar(dados.motivo());
}

}

3 respostas

Bom dia Eric, cara para entender melhor o contexto, seria top você disponibilizar o código completo, por exemplo no GItHub, mas baseado nas informações que você forneceu, você está chamando o método escolherMedico sem passar o id e era pra ele retornar uma mensagem dizendo para passar a especialidade, porém essa exception só será lançada quando a especialidade for null, quando você passa o id null e a especialidade, ele chama o método escolherMedicoAleatorioLivreNaData e em algum destes fluxos (eu precisaria de todo o código) ele usa o campo id que você ta passando como null, onde gera a exception que você mandou. Outra coisa, da uma olhada onde a exception está estourando, no log a exception mostra a linha que ela foi lançada, as vezes ela está sendo lançada em outra classe.

Bom dia, aqui o diretorio do github pra melhor visualização do codigo: https://github.com/Eric-Nascimento/MedApi

Oi!

Essa sua linha:

var medico = medicoRepository.findById(dados.idMedico()).get()

Deveria ser assim na verdade:

var medico = escolherMedico(dados);