web-dev-qa-db-ja.com

java.time.localdateTime - Jackson.のインスタンスを構築できません

JMSメッセージングとActiveMQを介して通信する2つのスプリングブートアプリケーションがあります。

1つのアプリは他のアプリにLocalDatetimeプロパティを含むオブジェクトを送信します。このオブジェクトは、他のアプリケーションに送信されるためにJSONにシリアル化されます。

私が直面している問題は、ジャクソンが受信JSONを自分のオブジェクトにマッピングしようとしているときにLocalDateTimeプロパティを逆シリアル化できないことです。 LocalDateTimeプロパティには、 "Listener App"に到着したときに次の形式があります。

"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 DataType JSR31 ==[〜#〜]推奨されていません[〜#〜]

上記の注釈を使用せずにこのLocalDateTimeプロパティを逆シリアル化する方法/代替案はありますか?または、推奨する jackson-modules-java8 を使って作業するにはどうすればよいですか。

4
Daniel Castillo

書いた解決策は正しいアプローチです。その他のアプローチについては後述する。パブリッククラスLocalDateSerializerは、JSonSerializerを実装します。{@ OVERRIDE PUBLE JSONELEMENT SERIALIZE(LocalDatetime LocalDateTime、タイプタイプ、jSonSerializationContext jSonSerializationContext){instown instant = localdateTime.atzone(zoneId.SystemDefault())。toinstant();日付日付= DATE.FROM(Instant);新しいJSONPrimitiveを返します(Date.GetTime())。 }}}

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

Gson gson = gsonBuilder.create();
 _

もう一つのアプローチ何らかの方法でこれを試してください。日付タイムフォーマットを文字列に変更してください。 "2011-04-08t09:00:00"。ナノやその他の形式はとても複雑です.LastSeen 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)
 _
0
Jin Thakur