1

JAX-RS を使用して RESTful インターフェイスを作成しています。現在、システムで利用可能なオブジェクトを確認するためのインデックス リソースを作成しています。

私の問題は、ユーザーが問題の実際のオブジェクトを選択するまで、映画オブジェクトの完全な表現を返すことは高価で不要であることです。

私の質問:

JSONシリアル化プロセスを制御して、このオブジェクトの「短い」バージョンと長いバージョンを提供する方法はありますか?または、短い形式を表すビューモデル風のクラスを作成する方がよいでしょうか?

私の問題の実例として映画データベースを使用する:

@GET
@Path("/api/movie/")
@Produces(MediaType.APPLICATION_JSON)
public List<Movie> ListMovies() {
    return entityManager.createQuery("FROM Movie", Movie.class).getResultList();
}

@GET
@Path("/api/movie/{movieId}")
@Produces(MediaType.APPLICATION_JSON)
public Movie GetMovie( @PathParam("movieId") Integer movieId ) {
    return entityManager.find(Movie.class,movieId);
}

最初のルートでは、 、、およびプロパティ/api/movieのみを含む短い形式のオブジェクトを返したいと考えていますが、2 番目のルートでは完全なオブジェクトが返されます。IDTitleYearProduced

これは簡単に解決できると思いますが、私は商売として Java の専門家ではないので、それを支援する注釈や何らかのヘルパーがあることを望んでいました。

編集:ない場合、最も簡単な方法は、要約クラス (ie: MovieSummary) を作成し、代わりにそれを返すことだと思います。

4

1 に答える 1

2

あなたの提案は良いと思います。API が返すものを表す補助オブジェクトを作成できます。これはDTOと呼ばれます。1 つのエンティティ オブジェクトに対して複数の DTO を作成できますが、これはあなたのケースだと思います。たとえばMovieSummaryDTO、インデックスと他のすべての場所でa を返します。MovieDTO

さらに、この新しいオブジェクトに、すべての注釈と、通常はデータ アクセス層に属さない「もの」を入れることができます。したがって、これはある程度、懸念事項を分離し、エンティティ オブジェクトを非常にきれいに保つのに役立ちます。

ただし、これにより新しい問題が発生します。エンティティと DTO の間で変換する必要があります。

これは、次のいずれかで実行できます。

  • 手動 - これらのマッピングを行うオブジェクトを作成するか、コンストラクターを使用して直接作成するだけです
  • 自動/一般 - リフレクション API を介してあるオブジェクトを別のオブジェクトにマップするライブラリがいくつかあります。私はこれらをお勧めします:

シリアル化するときに特定のプロパティを無視できることを付け加えたいと思います。Jackson を使用している場合 (これを使用する必要があります)、プロパティに で注釈を付けることができますが@JsonIgnore、そのプロパティはシリアル化されません。ただし、余分なプロパティを無視したい場合もあれば、そうでない場合もあるため、これは必要なものではないと思います。

これが役に立ったことを願っています。ハッピーコーディング!

于 2013-09-18T08:37:19.787 に答える