9

消費しているサービスの逆シリアル化中に使用するクラスに次のフィールドがあります。

private ZonedDateTime transactionDateTime;

私が利用しているサービスは、次のパターンを使用して Date または DateTime を返す場合があります。yyyy-MM-dd'T'HH:mm:ss.SSSZ

サービスが返すものの例を 2 つ挙げましょう。

  • 2015-11-18T18:05:38.000+0200
  • 2015-11-18T00:00:00.000+0200

前者は問題なく動作しますが、後者は逆シリアル化中に次の例外がスローされます。

java.time.format.DateTimeParseException: テキスト '2015-11-18T00:00:00.000+0200' をインデックス 23 で解析できませんでした

私は使用しています;

  • スプリング ブート 1.3.1
  • Jackson 2.6.4 (JSR310 モジュールを含む)

これにはカスタム逆シリアル化クラスが必要ですか?

4

5 に答える 5

4

コードの前半で、注釈付きのフィールドを使用して@JsonFormatいましたが、JavaDocs が示唆するようなシリアル化のみを目的としていると考えたため、それを削除しました。

その注釈を追加し直す必要があることが判明しました。そして実際の問題は、サード パーティ サービスの応答が実際に間違っていたこと (XML にラッパー要素が欠落していた) であり、これにより逆シリアル化が失敗しました。エラーは次のとおりです。

com.fasterxml.jackson.databind.JsonMappingException: タイプ [単純型、クラス com.foo.bar.adapter.john.model.account.UserAccount] の値を文字列値からインスタンス化できません ('2015-11-18T00:00: 00.000+0200'); 単一文字列のコンストラクタ/ファクトリ メソッドはありません

フィールドは次のように記述されます。

@JsonFormat(pattern = Constants.DATETIME_FORMAT)
@JacksonXmlProperty(localName = "transactionDate")
private ZonedDateTime transactionDateTime;

@JsonRootName("transaction")また、オブジェクトがコレクションにラップされているため、このフィールドのクラスに追加する必要がありました。

于 2016-01-13T15:07:27.690 に答える
0

私は使用しました

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
private ZonedDateTime startDate;

プラスjackson-datatype-jsr310ライブラリ、明らかに。

このソリューションはJacksonで説明されていますISO8601形式の日時をJava8 Instantにデシリアライズします

于 2020-04-29T16:31:02.797 に答える