14
respostas

[Bug] SQL Error: 1048, SQLState: 23000

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" Print do erro que está acontecendo

14 respostas

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.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Está tudo ok nessas classes.

ME manda também a classe Consulta e o json que você está enviando na requisição.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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