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!

0
respostas

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?