通常の操作をサポートするコレクション /cars があり、/cars/{id} もサポートしているとします。
/cars の GET を取得したときにコレクション要素の限られた「ビュー」のみを返すためのベスト プラクティスは何ですか? つまり、ID、名前をリストするだけで十分であり、クライアントがさらに情報を必要としている場合は、/cars/{id} を介してより詳細にクエリを実行できます。
これは、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 がビュー処理を無効にし、レンダリング用に指定された明示的なビューがない限り、すべてのビュー アノテーションを無視するためです。これに対する回避策を書きました(ビューが指定されていない場合、デフォルトのビューに属するプロパティのみがシリアル化されるように)。シリアライゼーションでしか動作せず、デシリアライゼーションでは動作しませんでした。興味があれば、掘り下げてみることができます。
バックエンドでORMライブラリを使用していると仮定して、2つの異なるクラスを定義します。1つはそのエンティティのすべての詳細をマッピングし、もう1つは概要に関連する属性の一部のみをマッピングします。次に、2つのメソッドでこれらを異なるタイプに戻すだけです。
これはかなり標準的なパターンだと思います。少なくとも、私が取り組んでいるプロジェクトでこの手法に出くわしました。