Boa tarde! Ao tentar add a constraint estou recebendo esse erro. alguem pode me ajudar? O que parece ser eh que esta trazendo um id nulo do banco e passando para uma variavel booleana. Por que motivo acontece isso?
Erro: Null return value from advice does not match primitive return type for: public abstract boolean br.com.alura.med.voll.api.domain.medico.MedicoRepository.findAtivoById(java.lang.Long)
Segue abaixo o código:
ConsultaController:
@RestController
@RequestMapping("consultas")
public class ConsultaController {
@Autowired
private AgendaDeConsultasService agendaDeConsultasService;
@PostMapping
@Transactional
public ResponseEntity<DadosDetalhamentoConsulta> agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
var dto = agendaDeConsultasService.agendar(dados);
return ResponseEntity.ok(dto);
}
@DeleteMapping
@Transactional
public ResponseEntity<DadosCancelamentoConsulta> cancelar(@RequestBody @Valid DadosCancelamentoConsulta dados) {
agendaDeConsultasService.cancelar(dados);
return ResponseEntity.noContent().build();
}
}
MedicoRepository:
@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 escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);
@Query("""
select m.ativo
from Medico m
where m.id = :idMedico
""")
boolean findAtivoById(Long idMedico);
}
ValidadorMedicoAtivo:
@Component
public class ValidadorMedicoAtivo implements ValidadorAgendamentoDeConsulta {
@Autowired
private MedicoRepository repository;
public void validar(DadosAgendamentoConsulta dados) {
// dados do medico opcional
if (dados.idMedico() == null) {
return;
}
var medicoEstaAtivo = repository.findAtivoById(dados.idMedico());
if (!medicoEstaAtivo) {
throw new ValidacaoException("Consulta não pode ser agendada com médico excluído");
}
}
}
AgendaDeConsultasService:
@Service
public class AgendaDeConsultasService {
@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 informado não existe!");
}
if (dados.idMedico() != null && medicoRepository.existsById(dados.idMedico())) {
throw new ValidacaoException("Id do médico informado não existe!");
}
validadores.forEach(v -> v.validar(dados));
var paciente = pacienteRepository.getReferenceById(dados.idPaciente());
var medico = escolherMedico(dados);
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 for escolhido");
}
return medicoRepository.escolherMedicoAleatorioLivreNaData(dados.especialidade(), dados.data());
}
public void cancelar(DadosCancelamentoConsulta dados) {
if (!consultaRepository.existsById(dados.idConsulta())) {
throw new ValidacaoException("Id da consulta informado não existe!");
}
var consulta = consultaRepository.getReferenceById(dados.idConsulta());
consulta.cancelar(dados.motivo());
}
}