12

POJOのフィールドで各逆シリアル化が実行された後、いくつかのコードを実行する必要があります。ジャクソンアノテーション(または他の)戦略を通じてこれを行う方法はありますか?

  1. これを行う1つの方法は、PostLogicDeserializerInterfaceを実装するか、PostLogicDeserializerAbstractを拡張する、フィールドタイプごとにカスタムデシリアライザーを作成することです。ただし、これにより、(@ JsonPropertyを使用するだけでなく)保守が困難な大量のコードが乱雑になります。ですから、これは良い考えではないと思います。

  2. @JsonDeserializeはクラスレベルで使用できますが、値クラスにのみ使用できることがわかりました。ドキュメントから:

値クラスに注釈を付ける場合、構成は値クラスのインスタンスに使用されますが、より具体的な注釈(メソッドまたはフィールドにアタッチする注釈)によってオーバーライドできます。

ですから、これもうまくいかないと思います。

  1. POJOのセッターメソッドでカスタムロジックを使用することは悪い習慣です。反対に、ジャクソンはリフレクションを使用してフィールドを設定していると思います...どちらも良い戦略ではありません。

私の目標は、デシリアライザーによって設定されたフィールドのパーセンテージを決定することです。呼び出された逆シリアル化(入力されたフィールド)ごとに増加するカウンターが必要になります。そして、クラス(POJO)の逆シリアル化全体が終了したら、リフレクションを使用していくつかのロジックを実行する必要があります。

私が今それを実装している方法は、

  • ジャクソンマッパーによってPOJOを逆シリアル化したら、リフレクションを使用して各フィールドを調べます
  • 設定されているかどうかを確認し、nullの場合はfi、プリミティブ番号(以前の初期値)の場合は-1を確認します。(このアプローチの1つの欠点は、ブール値が設定されているかどうかを確認できないことです)
  • 他の種類のチェックにリフレクションを使用します(ロジックXと呼びます)
  • セットフィールドとロジックXのパーセンテージに依存するロジックを実行します。

POJOをリフレクションでチェックする必要がないので、ジャクソン戦略を好むでしょう。それはむしろその場で行われることを望みます(POJOが逆シリアル化されるとき)。

乾杯、
デスポット

4

2 に答える 2

5

この時点では、後処理または前処理を行う特定の機能はありません。そして、この種のデータバインディングが何をすべきかの境界に近づきます。特定のフィールドに対してこれを行う必要がある場合は、おそらくセッターに追加するだけです。これは簡単なことで機能するためです。ただし、関連するすべてのセッターで同じロジックが必要です。

@JsonDeserialize は個々のプロパティ (フィールド、セッター) にも使用できるため、カスタム デシリアライザーを作成できます。また、後処理が必要なため、「実際の」デシリアライザーを見つけることができます (理想的には、またはのいずれかをJsonDeserializer実装することによって)。ここでは関係ありませんが、一般的なケースでは、循環依存関係の問題を回避するためにここで行われます)、それに委譲し、値を変更します。これは、フィールドよりも重要な値であると想定しています。ContextualDeserializerResolvableDeserializer

BeanDeserializer最後に、インスタンスを (登録することによって)変更する方法もありますBeanDeserializerModifier。関連するコンポーネント (SettableBeanProperty だと思います...) をサブクラス化して、追加の処理をフックしたり、使用するデシリアライザーを置き換えたりして、元の "デフォルトの」デシリアライザー。

しかし、最終的には、あなたのケースは別の方法で処理するのが最善のように思えます。たとえば、Bean Validation API (jsr-303) は、後処理ロジックに適している可能性があるようです。これはデータ バインディングとはある程度直交しているため、データ バインディング (jackson) とは無関係であり、再利用可能であり、すべての優れた機能を備えているため、優れた代替手段になる可能性があります。

于 2011-04-02T18:14:04.553 に答える