1

通常の操作をサポートするコレクション /cars があり、/cars/{id} もサポートしているとします。

/cars の GET を取得したときにコレクション要素の限られた「ビュー」のみを返すためのベスト プラクティスは何ですか? つまり、ID、名前をリストするだけで十分であり、クライアントがさらに情報を必要としている場合は、/cars/{id} を介してより詳細にクエリを実行できます。

4

2 に答える 2

2

これは、Jackon の@JsonView注釈の有力な候補となる可能性があります。私は通常、共通のパッケージでいくつかのマーカー インターフェースを定義します (アプリ全体で再利用できます)。

public interface View {
    public interface Partial { }
    public interface Full extends Partial { }
}

そして、次のように car クラスでそれらを使用できます。

public class Car {
    private int id;
    private String name;
    //Supresses serialization of this property when another view is active
    @JsonView(View.Full.class)
    private String description;

    ......
}

最後に、リソースで適切なビューをアクティブにします。

@Path("/")
@JsonView(View.Partial.class)
public Collection<Car> getAll();

@Path("/{id}")
@JsonView(View.Full.class)
public Car getById(@PathParam("id") int id);

@JsonView(View.Partial.class)メソッドから省略getAll()すると、すべてのプロパティがシリアル化されます (この場合、descriptionシリアル化されないと予想される場合があります)。これは、Jackson がビュー処理を無効にし、レンダリング用に指定された明示的なビューがない限り、すべてのビュー アノテーションを無視するためです。これに対する回避策を書きました(ビューが指定されていない場合、デフォルトのビューに属するプロパティのみがシリアル化されるように)。シリアライゼーションでしか動作せず、デシリアライゼーションでは動作しませんでした。興味があれば、掘り下げてみることができます。

于 2013-03-03T06:04:19.407 に答える
0

バックエンドでORMライブラリを使用していると仮定して、2つの異なるクラスを定義します。1つはそのエンティティのすべての詳細をマッピングし、もう1つは概要に関連する属性の一部のみをマッピングします。次に、2つのメソッドでこれらを異なるタイプに戻すだけです。

これはかなり標準的なパターンだと思います。少なくとも、私が取り組んでいるプロジェクトでこの手法に出くわしました。

于 2013-03-01T13:34:20.103 に答える