9

我有一个类,它的注释@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在类级别有 a )。

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

@Path我是否遗漏了什么 - 如果我只是注释方法(我无法让它工作),我是否可以通过某种方式让 Jersey 将该类作为资源类拾取,如果没有,我可以强制绝对映射( @Path(/widget/{id}))或一些相对映射 ( @Path(../widget/id) - 这些在现实中都不起作用 - 只是我所追求的类比。谢谢!

4

2 回答 2

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 的非常简洁的教程: apigee 的“Teach a dog to REST”我认为这是一个非常好的视频。作者提出了几个很好的观点。这是同一演示文稿的更长版本的链接


这部分是关于你想要什么:

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

@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
    //...
  }
}
于 2012-06-21T17:53:08.237 回答
2

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

我不会在你的路径中切换复数和单数。由于您为两者访问相同类型的资源,因此您的根目录应该相同。第二种形式只是对其进行了更多的指定——一种基于矢量的方法来获得更具体的信息。

于 2012-06-21T17:46:30.673 回答