【问题标题】:Managing a nested resource in Jax-RS/Jersey that sometimes should behave as a non-nested resource管理 Jax-RS/Jersey 中的嵌套资源,该资源有时应表现为非嵌套资源
【发布时间】:2016-07-06 10:11:06
【问题描述】:

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

我的设计包括这两个调用:

  • /webapi/items
  • /webapi/store/1/items

他们都应该返回一个物品清单,第一个应该返回在那个国家销售的所有物品,第二个应该只返回商店编号 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 的嵌套资源,但关键是这并不总是正确的,因为有时我想在不传递商店 ID 的情况下调用 ItemResource 来获取所有项目(这是第一个请求 http://foo.com/webapi/items 的情况。 我想在 ItemResource 上保留 @Path("items") 注释,以便它处理对 /items 端点的每个请求。

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

【问题讨论】:

  • 我不知道这是否是最好的做法,但您仍然可以在类注释中放置任何内容(例如@Path("/"))并将"/item""/stores..." 添加到您的函数中注释,但在这种情况下,所有请求都将被重定向到同一个类。
  • 感谢您的回答。我认为这是一种非常常见的情况,所以我想知道我是否遗漏了一些关于设计的重要内容。使用注解@Path("items") 创建非嵌套资源和使用注解@Path("/") 创建嵌套资源怎么样?
  • 但在这种情况下,“foo.com/webapi/stores...”不会被您的资源捕获,因为根路径是“items”。

标签: rest jersey jax-rs nested-resources


【解决方案1】:

您可以通过从父资源返回资源来创建嵌套资源。

// 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
  }
}

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多