Невозможно создать экземпляр java.time.LocalDateTime - Джексон - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два приложения Spring Boot, которые общаются через JMS Messaging и ActiveMQ.

Одно приложение отправляет другому приложение объект, который содержит свойство LocalDateTime.Этот объект сериализуется в JSON для отправки в другое приложение.

Проблема, с которой я сталкиваюсь, заключается в том, что Джексон не может десериализовать свойство LocalDateTime, когда пытается сопоставить входящий json с моим объектом.Свойство LocalDateTime имеет следующий формат, когда оно прибывает в «приложение слушателя»:

"lastSeen":{
  "nano":0,
  "year":2019,
  "monthValue":4,
  "dayOfMonth":8,
  "hour":15,
  "minute":6,
  "second":0,
  "month":"APRIL",
  "dayOfWeek":"MONDAY",
  "dayOfYear":98,
  "chronology":{
    "id":"ISO",
    "calendarType":"iso8601"
  }
}

Исключение, которое я получаю, следующее:

org.springframework.jms.support.converter.MessageConversionException: Failed to convert JSON message content; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.LocalDateTime

Я смог временно решить эту проблему, используя следующие аннотации:

@JsonSerialize(as = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class, as = LocalDateTime.class)
private LocalDateTime lastSeen;

, но они принадлежат тип данных jackson jsr310 , который теперь УСТАРЕЛ .

Есть ли способ / альтернатива десериализации этого свойства LocalDateTime без использования вышеупомянутых аннотаций?Или как заставить это работать, используя рекомендованный jackson-modules-java8 ?

1 Ответ

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

Решение, которое вы написали, является правильным подходом.Другие подходы упомянуты ниже.открытый класс LocalDateTimeSerializer реализует JsonSerializer {@Override public JsonElement serialize (LocalDateTime localDateTime, тип type, JsonSerializationContext jsonSerializationContext) {Instant instant = localDateTime.atZone (ZoneId.systemDefault ()). toInstant ();Дата дата = Date.from (мгновенный);вернуть новый JsonPrimitive (date.getTime ());}}

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer());

Gson gson = gsonBuilder.create();

Другой подход.В любом случае попробуйте это.Попробуйте изменить формат даты и времени на строку."2011-04-08T09: 00: 00".Нано и другие форматы настолько сложны, что я не могу сказать по вашему последнему json, о какой именно дате и времени вы говорите.Он также пропускает часовой пояс, поэтому ваше местное время может быть в любом месте, в котором вы развертываете решение. Если вы используете 3 разных часовых пояса, местное время будет неправильным.Используйте этот формат строки или создайте свой собственный "2011-04-08T09: 00: 00"

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

@JsonDeserialize(using = CustomJsonDateDeserializer.class)
...