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

Cannot deserialize value of type `java.lang.String

Ao tentar salvar no banco de dados a data que tenho recebido do meu fornt estou recebendo o seguinte erro:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)]

A minha entidade o campo data esta assim:

private LocalDate dataNascimento;

No meu dto o campo data esta assim:

@JsonFormat(pattern = "yyyy-MM-dd")
        @JsonDeserialize(using = LocalDateDeserializer.class)
        LocalDate dataNascimento,

Na tentativa de resolver criei também as seguintes classe de configuração:

@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat("dd-MM-yyyy");
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
            builder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
        };
    }
}
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
    @Override
    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // Implemente a lógica para converter o JSON em LocalDate
        return LocalDate.parse(p.getText(), DateTimeFormatter.ISO_DATE);
    }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
                .modules(new JavaTimeModule())
                .build();

        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

Alguém poderia me ajudar a descobrir como resolvo este problema?

2 respostas

Parece que o problema está relacionado à forma como o JSON está sendo enviado para o backend e como está sendo desserializado para o tipo LocalDate. O erro indica que o sistema está tentando desserializar um objeto JSON como uma String, o que pode estar causando conflito. Aqui estão algumas sugestões para resolver o problema:

  1. Formato da Data no JSON: Certifique-se de que a data enviada do front-end para o backend está no formato esperado ("yyyy-MM-dd"). O uso de @JsonFormat(pattern = "yyyy-MM-dd") no DTO indica que o formato esperado é esse.
  2. Configuração Jackson no Backend: No seu JacksonConfig, você configurou o formato de data para "dd-MM-yyyy", mas no DTO você especificou "yyyy-MM-dd". Tente manter essas configurações consistentes. Se o formato desejado for "yyyy-MM-dd", ajuste a configuração em JacksonConfig para refletir isso.
  3. Remoção de Configurações Redundantes: Pode ser útil remover configurações redundantes para evitar conflitos. Certifique-se de que as configurações no WebConfig e JacksonConfig estejam alinhadas.
  4. Aprimoramento na Deserialização: No seu LocalDateDeserializer, verifique se a lógica de conversão do JSON para LocalDate está correta. Pode ser útil imprimir o valor de p.getText() para garantir que está recebendo o formato esperado. Tente ajustar esses pontos e veja se resolve o problema. Certifique-se de testar novamente após as modificações. Se o problema persistir, é possível que haja outros detalhes no código que precisem ser examinados mais de perto.
solução!

Mudei a minha classe jackson que agora esta assim:

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }
}

coloquei no meu dto as anotações:

        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
        @JsonDeserialize(using = LocalDateDeserializer.class)
        LocalDate dataNascimento,

Também conferi qual formato estou recebendo do meu front que no caso é angular:

Data formatada para o backend: 1961-09-26

E estou usando o LocalDateDeserializer da própria fasterxml.jackson.datatype mas mesmo assim permaneço com o erro.