Jersey @Path用于同一类中的复数/单个REST名词

时间:2012-06-21 17:25:56

标签: java rest jersey

我有一个类,用@Path注释,如下所示:

@Path("widgets")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

    @GET
    public Response getWidgets(@QueryParam("limit"))
    {
     //This class returns the plural noun, a list of widgets
    //...}

@GET
@Path("widget/{id}")
    public Response getWidgetById(@PathParam("id") long id)
    {
     //This class returns a single widget by id
    //...}

当我启动测试客户端时,localhost / widgets按预期映射,但getWidgetById方法映射到localhost/widgets/widget/{id}时。这不是我想要的 - 我希望localhost/widgets and localhost/widget/{id}

我尝试在类级别省略@Path注释,但这会阻止Jersey将此类识别为REST资源(我同时尝试了ScanningResourceConfigClassNameResourceConfig - 两者都是除非在类级别有@Path,否则无法将该类作为资源加载。

我猜一个(丑陋的)解决方法是在类WidgetResource类和WidgetsResource类之间拆分方法。我认为这是一个糟糕的解决方案,因为这两种方法在同一个类中共享资源,但我真的需要REST-ful localhost/widget(对于单个实体)和localhost/widgets(对于复数)。< / p>

我错过了什么 - 如果我只是@Path注释方法(我无法让它工作),我有什么办法让泽西拿起这个类作为资源类,如果不能我强制绝对映射(@Path(/widget/{id}))或一些相对映射(@Path(../widget/id) - 这些都不是现实中的工作 - 只是我所追求的类比。谢谢!

2 个答案:

答案 0 :(得分:11)

这部分是关于您需要的

就个人而言,我发现你的映射很奇怪而且令人困惑。保持这样:

@Path("widgets")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

  @GET
  public Response getWidgets(@QueryParam("limit")) {
   //This method returns the plural noun, a list of widgets
   // it's also possible to limit the number returned by
   // using a query parameter. You could easily implement
   // pagination by adding further query parameters like
   // 'offset', 'sortOrder', etc.
   //...
  }

  @GET
  @Path("{id}")
  public Response getWidgetById(@PathParam("id") long id) {
    //This method returns a single widget by id
    //...
  }
}

将路径附加到具有ID的集合以从集合中获取对象似乎很自然。真的没有必要让它widgets/widget/{id}widget部分显而易见且不必要。

这是关于RESTful API的一个非常简洁的教程:"Teach a dog to REST" by apigee我认为这是一个非常好的视频。作者提出了几点好处。这是longer version of the same presentation

的链接

这部分是关于您想要的

如果你真的想保留复数/单数二元论(我真的不推荐),你可以这样注释你的代码: 但这真的很难看

@Path("/")
@Produces(MediaType.APPLICATION_XML)
public class WidgetResource {

  @GET
  @Path("widgets")
  public Response getWidgets(@QueryParam("limit")) {
   //This method returns the plural noun, a list of widgets
  //...}

  @GET
  @Path("widget/{id}")
  public Response getWidgetById(@PathParam("id") long id) {
    //This method returns a single widget by id
    //...
  }
}

答案 1 :(得分:2)

我的建议是让你的道路是: "widgets""widgets/id/{id}"。或者,如果您知道自己永远不会通过id之外的任何内容进行查询,那么您的第二个可能只是"widgets/{id}"

我不会在你的道路中在复数和单数之间切换。由于您为两者访问相同类型的资源,因此您的根应该是相同的。第二种形式只是更多地指定它 - 一种基于矢量的方法来获得更具体的信息。