Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre validação de datas

No dto de dadosAgendamentoConsulta temos a propriedade de dataConsulta que esta declarada da seguinte forma

@NotNull @Future LocalDateTime dataConsulta,

Para validar se contém consulta no mesmo horario para aquele médico em específico , o sistema apenas pega a data de consulta enviada e coloca como clausula where no banco.

Sendo assim se eu agendo uma consulta com a seguinte data no payload '2023-11-08T15:35:50' e logo após tento agendar uma outra consulta com a seguinte data '2023-11-08T15:45:50' (Neste exemplo eu mudei o pacienteId e mantive apenas o medico id) a validação esta deixando marcar.

Olhando no forum vi que teve uma solução proposta a um aluno de colocar o @JsonFormat fixando os minutos e segundos em zero, porem ao colocar esta anotação a aplicação para rodar pois retorna um erro que não consegue serializar/deserializar a string para LocalDateTime

Foi proposto na resposta que vi no forum colocar a anotação @JsonFormat(pattern = "yyyy-MM-dd HH:00:00") na propriedade de dataConsulta do dto de DadosAgendamento

Adicionei para testar e agora ao tentar agendar tenho o retorno do seguinte erro.

//se eu tento mandar no formato que estava sendo utilizado na aula
JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2023-11-18T15:35:50": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2023-11-18T15:35:50' could not be parsed at index 10

//se eu tento mandar no formato semelhante ao esperado pelo jsonFormat
JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String "2023-11-18 15:35:50": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2023-11-18 15:35:50' could not be parsed at index 14

Como fazer para esta anotação funcionar? Tem de ser feito alguma configuração ?

1 resposta
solução!

Oi!

Uma alternativa é sobrescrever o método dataConsulta no record e devolver a data com o minuto e segundo valendo 0:

public record DadosAgendamentoConsulta(
        Long idMedico,

        @NotNull
        Long idPaciente,

        @NotNull
        @Future
        LocalDateTime dataConsulta,

        Especialidade especialidade) {
        
        public LocalDateTime dataConsulta() {
            return dataConsulta.withMinute(0).withSecond(0);
        }
}

Bons estudos!