Джексон конвертирует LocalDatetime - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть поле LocalDateTime с @JsonFormat

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

Когда Джексон пытается проанализировать дату, например 2018-11-28T15: 24: 00.000Z выдается исключение

com.fasterxml.jackson.databind.JsonMappingException: Невозможно создать экземпляр java.time.LocalDateTime: нет конструктора аргумента String / метода фабрики для десериализации из значения String ('2018-11-28T15:24: 00.000Z ')

В моем pom.xml у меня есть:

  • Пружинная загрузка 1.5.7
  • jackson-datatype-jdk8
  • jackson-datatype-jsr310

My ObjectMapper Bean:

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

Я также пробовал:

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Я также сталкивался с этой проблемой при использовании OffsetDateTime.Я просто добавил @JsonSerialize и @JsonDeserialize (написал собственный десериализатор, расширив JsonDeserializer<>) вместе с форматом.Проблема решена.

0 голосов
/ 19 августа 2019

Я также столкнулся с той же проблемой и написал собственный сериализатор и десериализатор, чтобы решить эту проблему.

Ниже приведены фрагменты кода для того же:

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;
0 голосов
/ 22 февраля 2019

Я столкнулся с похожими проблемами.Причина этой проблемы состоит в том, что mapper не может создать экземпляр LocalDateTime из объекта String.Ниже решит вашу проблему.

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

Если вы не хотите явно упоминать Serializer / Deseralizer, вам придется выполнить одно из следующих действий в соответствии с руководством JackSon для выпуска улучшений DateTime Java 8.

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

ИЛИ

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

В SpringBoot экземпляр ObjectMapper имеет функцию AutoWired, и поэтому я не знаю, можем ли мы явно выполнить какое-либо из решений.Так что на данный момент мое лучшее предложение - грязное решение явного упоминания Serializer / Deserializer.

Страница ReadMe для улучшения JackSon Java8 LocalDateTime приведена ниже

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...