2016-07-06 1 views
0

Jax-RS Jersey로 간단한 API를 개발하고 있습니다. 일부 국가의 상점에서 판매하는 품목의 도메인을 고려하고 있다고 가정 해 보겠습니다.Jax-RS/Jersey에서 중첩되지 않은 리소스로 동작해야하는 중첩 리소스 관리

  • /webapi/항목
  • 둘은 항목의 목록을 반환해야

/webapi/저장/1/항목, 첫 번째 :

내 디자인이 두 호출을 포함 해당 국가에서 판매되는 모든 품목을 반품해야하며 두 번째 품목은 상점 번호 1로 판매되는 품목 만 반품해야합니다.

물론 두 자원 인 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) { 
} 

StoreResource과 모델 클래스 Item 또는 특정 항목을 관리하기 위해 생성 (DAO를 같은) 데이터베이스 인터페이스 사이에 커플 링을 방지하기 위해, ItemResource 두 번째 요청을 전달하는 것입니다. 하위 리소스 나 StoreResource의 중첩 된 리소스와 같은 ItemResource를 고려할 수 있지만 포인트는 가끔씩 저장소 ID를 전달하지 않고 ItemResource를 호출하여 모든 항목을 가져 오기 때문에 이는 첫 번째 요청 http://foo.com/webapi/items의 경우입니다. ItemResource@Path("items") 주석을 보관하여/item 엔드 포인트에 대한 모든 요청을 처리하도록하고 싶습니다.

이 상황에서 올바른 디자인은 무엇입니까? 어떤 도움을 주셔서 감사합니다.

+0

이 할 수있는 가장 좋은 방법인지 모르겠어요,하지만 당신은 여전히 ​​('@Path ("/")'예를 들어)을 추가' "/ 항목에"'클래스 주석에 아무것도 넣지 수 및 "/ stores ..."를 함수 주석에 추가하지만이 경우 모든 요청은 동일한 클래스로 리디렉션됩니다. – NAIT

+0

답해 주셔서 감사합니다. 이것은 매우 일반적인 상황이라고 생각합니다. 그래서 디자인과 관련하여 중요한 것을 놓치고 있는지 궁금합니다. 어노테이션 @Path ("items")과 어노테이션 @Path ("/")가있는 중첩 된 리소스로 중첩되지 않은 리소스를 만드는 것은 어떻습니까? – Francotube100

+0

그러나이 경우 "http : //foo.com/webapi/stores/..."는 루트 경로가 "항목"이기 때문에 리소스에 걸리지 않습니다. – 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 
    } 
} 
관련 문제