2016-07-06 4 views
0

Jax-RS Jerseyで簡単なAPIを開発しています。ある国の店舗で販売されている商品のドメインを検討しているとします。Jax-RS/Jerseyで入れ子になっていないリソースとして振る舞う必要があるネストされたリソースを管理する

私のデザインは、これら2つのコールが含まれます。

  • /WEBAPI /アイテム
  • /WEBAPI /店舗/ 1 /アイテム

をどちらも最初、項目のリストを返す必要がありますその国で販売されているすべての商品を返品する必要があります。もう1つは、店舗番号1で販売されている商品のみを返品する必要があります。

私は、もちろん2つのリソース、ItemResourceアイテムに関するすべての要求、およびストアに関するすべての要求を処理するStoreResourceがあります。

@Path("items") 
class ItemResource { 

@GET 
public List<Item> getAllItems(){ 
} 

。私がしたいどの

@Path("stores") 
class StoreResource 

@GET 
@Path("/{storeId}/items") 
public List<Item> getItemsSoldByStore(@PathParam("storeId") long storeId) { 
} 

は、具体的にアイテムを管理するために作成した(のDAO等)StoreResourceとモデルクラスItem又はデータベースインターフェースとの間の結合を回避するために、ItemResourceに第2の要求を通過させることです。 私は、サブリソースやStoreResourceのネストされたリソースのようなItemResourceを考えることができますが、時にはStore IDを渡さずにItemResourceを呼び出して、これは最初の要求http://foo.com/webapi/itemsの場合です)。 ItemResource@Path("items")注釈を残しておきたいので、/ itemsエンドポイントへのすべての要求を処理します。

この状況で正しいデザインは何ですか?助けてくれてありがとう。

+0

'それを行うための最善のことだかどうかは知りませんが、それでも(たとえば' @Path(「/」) ')クラスの注釈には何も入れていないことができ、'「/アイテム」を追加''/stores ... ''をあなたの関数アノテーションに追加しますが、この場合、すべてのリクエストは同じクラスにリダイレクトされます。 – NAIT

+0

答えをありがとう。私はこれが非常に一般的な状況だと思うので、私はデザインに関して何か重要なものを見逃しているのだろうかと思っていました。アノテーション@Path( "items")とアノテーション@Path( "/")を持つネストされたリソースを持つネストされていないリソースを作成するとどうなりますか? – Francotube100

+0

しかし、この場合 "http://foo.com/webapi/stores/..."は、ルートパスが "items"なので、あなたのリソースに捕まえられません。 – NAIT

答えて

0

ネストされたリソースは、親リソースからリソースを返すことで作成できます。

// Parent resource 
@Path("stores") 
class StoreResource { 

    @GET 
    @Path("/{storeId}/items") 
    public List<Item> getItemsSoldByStore(@PathParam("storeId") long storeId) { 
    return ItemResource(storeId); 
    } 
} 

// nested resource 

class ItemResource { 

    @GET 
    @Path("{storeId}") 
    public List<Item> getAllItems(@PathParam("storeId")){ 
    // return your items 
    } 
} 
関連する問題