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?