在Jax-RS / Jersey中管理嵌套资源,有时应该表现为非嵌套资源

时间:2016-07-06 10:11:07

标签: rest jersey jax-rs nested-resources

我正在使用Jax-RS Jersey开发简单的API。我们假设我正在考虑某些国家/地区商店销售商品的域名。

我的设计包括以下两个电话:

  • /的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) {
}

我想要做的是将第二个请求传递给ItemResource,以避免StoreResource和模型类Item或专门为管理项目而创建的数据库接口(如DAO)之间的耦合。 我知道我可以将ItemResource视为子资源或StoreResource的嵌套资源,但关键是这并非总是如此,因为有时我想调用ItemResource而不传递商店ID,以获取所有项目(这是第一个请求http://foo.com/webapi/items)的情况。 我希望将@Path("items")注释保留在ItemResource上,以便它处理对/ items端点的每个请求。

在这种情况下,正确的设计是什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分: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
  }
}