ホームページ  >  記事  >  LocalDateTime の逆シリアル化の問題: Jackson InvalidFormatException

LocalDateTime の逆シリアル化の問題: Jackson InvalidFormatException

王林
王林転載
2024-02-22 13:58:06359ブラウズ

php エディタ Zimo は、Java が LocalDateTime を逆シリアル化するときの問題の解決策を提供します。逆シリアル化に Jackson ライブラリを使用する場合、特に LocalDateTime 型を処理する場合に、InvalidFormatException 例外が発生することがあります。この記事では、この一般的な逆シリアル化例外を正常に解決できるように、この問題の原因と解決策を詳しく紹介します。

質問内容

スプリング ブート アプリケーションで localdatetime のデシリアライズに問題があります。以下は関連するコードです。

###フロントエンド:### リーリー

バックエンド: lancamento クラス:

リーリー

レスモランカメントクラス:

リーリー ###質問:###

com.fasterxml.jackson.databind.exc.invalidformatException: 文字列 '10/01/2024' 型の値から逆シリアル化できません

java.time.localdatetime

: java.time.localdatetime を逆シリアル化できません: (java.time.format .datetimeparseException) テキスト '10/01/2024' を解析できません: Temporalaccessor から localdatetime を取得できません: {}、iso は java.time.format.parsed 型の 2024-01-10 として解析されます [ソース: (org.springframework.util.streamutils$noncloseinputstream); 行: 1、列: 63] (参照チェーン経由: com.algaworks.algamoney_api.domain.model.lancamento["datavencimento"])

lancamentos の console.log() では、属性「datavencimento」と「datapagamento」の形式は「dd/mm/yyyy」です。 逆シリアル化中に日付形式に問題があると思われます。フロントエンドとバックエンドのコードを更新しても、問題は解決しません。問題はクライアントにあると思いますが、わかりません。

スプリングブートアプリケーションで文字列からlocaldatetimeを逆シリアル化するときにinvalidformatExceptionを修正するにはどうすればよいですか?

localdatetime の正しいシリアル化と逆シリアル化には、特定の構成や調整が必要ですか?
  1. ご指導やご提案をいただければ幸いです。ありがとう!
  2. dataconverter() メソッドですべてを実行しましたが、まだ成功しません。
update(lancamento: lancamento): promise<lancamento> {
      const headers = new httpheaders()
        .set('authorization', this.chave)
        .set('content-type', 'application/json');

        this.conversordedata([lancamento]);

        return firstvaluefrom(this.http.put<any>(`${this.url}/${lancamento.codigo}`,
      lancamento, { headers }));
    }

    findbycode(codigo: number): promise<lancamento> {
      const headers = new httpheaders()
        .set('authorization', this.chave);

      return this.http.get(`${this.url}/${codigo}`,
        { headers })
        .topromise()
        .then((response: any) => {
          const lancamento = response as lancamento;

          this.conversordedata([lancamento]);

          return lancamento;
        })
        .catch((error: any) => {
          console.error('erro ao buscar lançamento por código: ', error);
          throw error;
        });
    }

//se os atributos forem do tipo date
conversordedata(lancamentos: lancamento[]){
  for(const lancamento of lancamentos){
    if(lancamento.datavencimento && isvalid(lancamento.datavencimento)){
      lancamento.datavencimento = new date(format(lancamento.datavencimento, 'dd/mm/yyyy'));
    }
    if(lancamento.datapagamento && isvalid(lancamento.datapagamento)){
      lancamento.datapagamento = new date(format(lancamento.datapagamento, 'dd/mm/yyyy'));
    }

  }
}

回避策

この問題を解決するには、次のいずれかを実行できます:

オプション 1: JSON 日付形式を調整する JSON ペイロードの日付形式を変更して、パターン「yyyy-mm-ddthh:mm:ss」または localdatetime と直接互換性のある形式に一致させます。例えば:### リーリー

オプション 2: @jsondeserialize を使用してカスタム逆シリアル化形式を指定する lancamento クラスの localdatetime フィールドに @jsondeserialize 注釈を付けて、カスタム逆シリアル化形式を指定できます。例えば:### リーリー

JSON ペイロードの逆シリアル化形式または日付形式を必ず調整して、正しく配置されていることを確認してください。要件とコーディングの実践に最も適した方法を選択してください。

オプション 3: この問題は、Java の localdatetime に、日付と時刻のコンポーネントを含むパターン "dd/mm/yyyy" に対する直接フォーマッタがないために発生します。日付コンポーネントのみに興味がある場合は、これらのフィールドのタイプを localdate に変更する必要がある場合があります。

リーリー

以上がLocalDateTime の逆シリアル化の問題: Jackson InvalidFormatExceptionの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。