entendi que a coluna data não pode estar vazia, mas não está, coloquei data e está tudo certo no insomnia, alguém sabe oq pode ser? estou fazendo o curso "Spring Boot 3: Documente, teste e prepare uma API para o deploy"
entendi que a coluna data não pode estar vazia, mas não está, coloquei data e está tudo certo no insomnia, alguém sabe oq pode ser? estou fazendo o curso "Spring Boot 3: Documente, teste e prepare uma API para o deploy"
Oi!
Pode ser que a data que não está chegando na API, por algum motivo, ou não está sendo setada no objeto Consulta.
Manda aqui um print da sua requisição no insomnia, e o código das suas classes: DadosAgendamentoConsulta
, ConsultaController
e AgendaDeConsultas
.
Está tudo ok nessas classes.
ME manda também a classe Consulta e o json que você está enviando na requisição.
O problema está na sua classe Consulta, na linha 46 tem o construtor que recebe os parâmetros mas não faz nada.
Certo! mas o que eu retorno ali dentro? no método que você utilizou no curso compilou perfeitamente, mas acredito que por conta de atualizações e etc.. possa ter mudado alguma coisa dentro do código. Inclusive baixando o projeto final do curso ele apresenta essa mesma falha de compilação que no caso seria na classe AgendaDeConsultas na Linha 49 "var consulta = new Consulta(null, medico, paciente, dados.data(), null);" nesta linha ele pede para criar um construtor, no caso o public Consulta.......();
É que no seu projeto você já fez a parte de cancelamento de consultas, então poed apagar o construtor da classe consulta e instanciar o objeto assim:
var consulta = new Consulta(null, medico, paciente, dados.data(), null);
repare na primeira imagem linha 41, ele ja esta sendo instanciado
No seu está assim (na classe AgendaDeConsultas):
var consulta = new Consulta(null, medico, paciente, dados.data());
Mas está faltando o último parâmetro que deve ser null:
var consulta = new Consulta(null, medico, paciente, dados.data(), null);
ahh sim, ok. vou testar
Copiei este código e mesmo assim não funcionou, acusa o mesmo erro de compilação e pede para criar o construtor na classe "Consulta" `
@Service public class AgendaDeConsultas {
@Autowired
private ConsultaRepository consultaRepository;
@Autowired
private MedicoRepository medicoRepository;
@Autowired
private PacienteRepository pacienteRepository;
@Autowired
private List<ValidadorAgendamentoDeConsulta> validadores;
public void 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);
}
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 médico não for escolhido!");
}
return medicoRepository.escolherMedicoAletorioLivreNaData(dados.especialidade(), dados.data());
}
public void cancelar (DadosCancelamentoConsulta dados) {
if (consultaRepository.existsById(dados.idConsulta())) {
throw new ValidacaoException("Id da consulta informada não existe");
}
var consulta = consultaRepository.getReferenceById(dados.idConsulta());
consulta.cancelar(dados.motivo());
}
} `
Então deve ser o Lombok que não está funcionando, pois tem a anotação @AllArgsConstructor na classe Consulta, que já cria automático o construtor com todos os atributos.
Removi ele e deu erro que a coluna data não pode ficar vazia coloquei novamente e continua retornando{ "id": null, "idMedico": null, "idPaciente": null, "data": null }
Os dados voltarem null como resposta da requisição é por conta do seu retorno no controller:
return ResponseEntity.ok(new DadosDetalhamentoConsulta(null, null, null, null));
Você deveria devolver os dados assim:
@PostMapping
@Transactional
public ResponseEntity agendar(@RequestBody @Valid DadosAgendamentoConsulta dados) {
var dto = agenda.agendar(dados);
return ResponseEntity.ok(dto);
}
Precisa alterar o método agendar da classe AgendaDeConsultas para retornar o dto:
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);
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);
}