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!

1
resposta

The given id must not be null

Segui os passos da aula de "Testando as validações", ao enviar uma requisição contendo o seguinte conteúdo para escolher uma consulta com um médico aleatório:

{
    "idPaciente": 3,
    "data": "2026-12-10T12:30"
}

O IntelliJ retorna o seguinte erro:

java.lang.IllegalArgumentException: The given id must not be null
    at org.springframework.util.Assert.notNull(Assert.java:182) ~[spring-core-7.0.7.jar:7.0.7]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.existsById(SimpleJpaRepository.java:371) ~[spring-data-jpa-4.1.0-RC1.jar:4.1.0-RC1]

Código do Agendamento de Consultas:

@Service
public class AgendamentoDeConsultas {

    @Autowired
    private ConsultaRepository consultaRepository;

    @Autowired
    private PacienteRepository pacienteRepository;

    @Autowired
    private MedicoRepository medicoRepository;

    @Autowired
    private List<ValidadorAgendamentoConsultas> validadores;

    public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) throws ValidacaoException {

        if (!pacienteRepository.existsById(dados.idPaciente())) {
            throw new ValidacaoException("O id do paciente não foi encontrado");
        }

        if (!medicoRepository.existsById(dados.idMedico())) {
            throw new ValidacaoException("O id do médico não foi encontrado");
        }

        validadores.forEach(v -> {
            try {
                v.validar(dados);
            } catch (ValidacaoException e) {
                throw new RuntimeException(e);
            }
        });

        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);
    }

    private Medico escolherMedico(DadosAgendamentoConsulta dados) throws ValidacaoException {
        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 for escolhido!");
        }

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

    public void cancelar(DadosCancelamentoConsulta dados) {
        if (!consultaRepository.existsById(dados.idConsulta())) {
            throw new ValidationException("Id da consulta informado não existe.");
        }

        var consulta = consultaRepository.getReferenceById(dados.idConsulta());
        consulta.cancelar(dados.motivo());
    }

}

Médico Repository:

public interface MedicoRepository extends JpaRepository<Medico, Long> {
    Page<Medico> findAllByAtivoTrue(Pageable paginacao);

    @Query("""
            select m from Medico m
            where 
            m.ativo = true
            and 
            m.especialidade = :especialidade
            and 
            m.id not in (
                select c.medico.id from Consulta c where 
                c.data = :data
            )
           order by rand()
           limit 1            
        """)
    Medico escolherMedicoAleatorioLivreData(Especialidade especialidade, LocalDateTime data);

    @Query("""
            select m.ativo
            from Medico m
            where 
            m.id = :id 
            """)
    Boolean findAtivoById(Long id);
}

Será que tem a ver com o id da Query?

1 resposta

Olá, Gabriel! Como vai?

O problema está relacionado ao método escolherMedico na sua classe AgendamentoDeConsultas. Quando você envia uma requisição para agendar uma consulta com um médico aleatório, o campo idMedico pode estar nulo, e isso é esperado. No entanto, seu método agendar está verificando a existência de um idMedico mesmo quando ele não é fornecido, o que pode estar causando o erro.

Aqui está uma possível solução para corrigir isso:

  1. Verifique se o idMedico é nulo antes de verificar sua existência no banco de dados. No método agendar, a verificação if (!medicoRepository.existsById(dados.idMedico())) deve ser feita apenas se idMedico não for nulo.

  2. Certifique-se de que a especialidade está sendo passada corretamente. Quando idMedico é nulo, a especialidade deve ser obrigatória para que um médico aleatório possa ser escolhido.

  3. Adicione uma verificação para o retorno do método escolherMedico. Se escolherMedico retornar nulo, você deve lançar uma exceção para indicar que não há médicos disponíveis na data solicitada.

Aqui está um exemplo de como você pode ajustar o método agendar:

public DadosDetalhamentoConsulta agendar(DadosAgendamentoConsulta dados) throws ValidacaoException {

    if (!pacienteRepository.existsById(dados.idPaciente())) {
        throw new ValidacaoException("O id do paciente não foi encontrado");
    }

    if (dados.idMedico() != null && !medicoRepository.existsById(dados.idMedico())) {
        throw new ValidacaoException("O id do médico não foi encontrado");
    }

    validadores.forEach(v -> {
        try {
            v.validar(dados);
        } catch (ValidacaoException e) {
            throw new RuntimeException(e);
        }
    });

    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);
}

Espero que essas sugestões ajudem a resolver o problema. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.