6

次のような POJO がいくつかあります。

class Items {
    List<Item> items;

    public List<Item> getItems() {
        return items;
    }

    ...
}

class Item {
    String name;
    Date insertionDate;

    ...
}

Dateカスタム形式を使用してフィールドをシリアル化できるようにしたいItem(「Date:xxx」のような日付にプレフィックスを追加する) が、常に実行したくない (他の消費者が使用しているため)このプレフィックスは必要ありません)、特定の場合のみ。

で注釈を付けるとItem、おそらくこの作業を行うことができます、特定の場合にのみ、このメソッドを使用してこのフィールドを常にシリアル化したいわけではないため、そうしたくありません。getInsertionDate()@JsonSerialize(using = CustomDateSerializer.class)

理想的には、シリアライゼーションをカスタマイズしたいコントローラーでこれを行います。

@JsonSerialize(using = CustomDateSerializer.class)
public List<Item> getItems() {
   ....
}

whereCustomDateSerializer extends SerializerBase<Date>と Jackson はList、デフォルトのシリアライザーを使用して各アイテムをシリアライズする必要があることを認識し、オブジェクトにヒットするとDate、カスタム シリアライザーを使用する必要があります。もちろん、これは使用方法ではないため機能しませんが、ラッパーでラップし、カスタムシリアル化が必要なときにそのラッパーを使用する@JsonSerialize以外に、これを機能させる方法はありますか? Item私はこれについて間違った方法で考えていますか?これを行う別の方法はありますか?

Spring MVC を使用しているため、シリアライゼーションを直接呼び出していないことに注意してください。

どんな助けでも大歓迎です:)

4

1 に答える 1

2

問題は、Jackson がgetItems()サービス エンドポイント メソッドである場合に注釈を認識しないことです。通常List<Item>、Spring が決定する型のみが渡されます。ただし、JAX-RS (Jersey など) では、そのメソッドに関連付けられたアノテーションが渡されます (おそらく、Spring にも何らかの方法があります)。ただし、それを渡すには、統合コード (JAX-RS、Jackson JAX-RS JSON プロバイダー モジュールの場合) からのサポートがもう少し必要です。

List必要な注釈を追加できるように、(型を渡さずに) 別の POJO を実際に作成する方が簡単な場合があります。

Jackson を直接使用していた場合は、使用ObjectWriterするデフォルトの日付形式を使用して指定することもできます。しかし、Spring でそれが可能かどうかはわかりません (ほとんどのフレームワークは、構成可能性を公開せず、公開するだけですObjectMapper)。

もう1つ注意してください-カスタムシリアライザー(および/またはデシリアライザー)の代わりに、Dates(およびJackson 2.x)で単純な注釈を使用することもできます:

public class DateStuff {
  @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="'Date:'yyyy'-'MM'-'dd")
  public Date date;
}

プロパティごとの形式のオーバーライドを指定します。

于 2013-01-03T19:06:03.623 に答える