Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro: Null return value from advice does not match primitive return type for: public abstract boolean

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

}
2 respostas
solução!

Oi!

No seu repository o retorno do método está como boolean (primitivo) ao invés de Boolean:

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

Oi Rodrigo!

Fiz a troca aqui e funcionou. E eu estava passando um id que não existia também, falta de atenção minha.

E também fiz essa alteração no código:

    if (!Boolean.TRUE.equals(medicoEstaAtivo)) {
        throw new ValidacaoException("Consulta não pode ser agendada com médico excluído");
    }

Agora consigo seguir no curso. Obrigado!