2 votes

Jackson convertit LocalDatetime

J'ai un champ LocalDateTime avec un format @JsonFormat.

@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
private LocalDateTime dateTime;

Quand Jackson essaie d'analyser une date comme 2018-11-28T15:24:00.000Z une exception est lancée

com.fasterxml.jackson.databind.JsonMappingException : Can not construct instance of java.time.LocalDateTime : no String-argument constructor/factory method to deserialize from String value ('2018-11-28T15:24:00.000Z')

Dans mon pom.xml j'ai :

  • Spring boot 1.5.7
  • jackson-datatype-jdk8
  • jackson-datatype-jsr310

Mon haricot ObjectMapper :

@Bean
public ObjectMapper postConstruct() {
    return this.builder
           .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .defaultUseWrapper(false)
            .build();
}

J'ai aussi essayé :

@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'", timezone ="UTC")
private LocalDateTime dateTime;

1voto

Surendra Raut Points 172

J'ai été confronté à des problèmes similaires. La raison de ce problème est que le mappeur n'est pas capable de créer une instance LocalDateTime à partir d'un objet String. La solution ci-dessous résoudra votre problème.

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'")
private LocalDateTime dateTime;

Si vous ne voulez pas mentionner explicitement Serializer/Deseralizer, vous devrez faire l'une ou l'autre des choses suivantes, conformément au guide JackSon pour la publication des améliorations de DateTime Java 8.

ObjectMapper mapper = new ObjectMapper()
   .registerModule(new ParameterNamesModule())
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule());

O

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();

Dans SpringBoot, l'instance ObjectMapper est AutoWired & donc je ne sais pas si nous pouvons explicitement faire l'une ou l'autre des solutions. Donc, pour l'instant, la solution sale consistant à mentionner explicitement Serializer/Deserializer est ma meilleure option.

La page ReadMe de l'amélioration de JackSon Java8 LocalDateTime est la suivante

https://github.com/FasterXML/jackson-modules-java8/blob/master/README.md

0voto

the_tech_maddy Points 473

J'ai également rencontré ce problème en utilisant OffsetDateTime . J'ai simplement ajouté @JsonSerialize y @JsonDeserialize (j'ai écrit un désérialiseur personnalisé en étendant JsonDeserializer<> ) ainsi que le format. Le problème a été résolu.

0voto

G.G. Points 333

J'ai également rencontré le même problème et j'ai écrit un sérialiseur et un dé-sérialiseur personnalisés pour résoudre le problème.

Vous trouverez ci-dessous les extraits de code correspondants :

import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
import java.io.IOException;
import java.time.LocalDateTime;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.TextNode;

public class JsonDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

@Override
public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
        JsonProcessingException {
    ObjectCodec oc = jp.getCodec();
    TextNode node = (TextNode) oc.readTree(jp);
    String dateString = node.textValue();
    return LocalDateTime.parse(dateString, ISO_OFFSET_DATE_TIME);
    }
}

import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
import java.io.IOException;
import java.time.LocalDateTime;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class JsonDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime date, JsonGenerator generator, SerializerProvider arg) throws IOException,
            JsonProcessingException {
        final String dateString = date.format(ISO_OFFSET_DATE_TIME);
        generator.writeString(dateString);
    }
}

**Using the above custom serializer and deserializer on the below request payload:**

    @JsonDeserialize(using = JsonDateTimeDeserializer.class)
    @JsonSerialize(using = JsonDateTimeSerializer.class)
    private LocalDateTime orderInitialized;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X