我有一个类,用@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资源(我同时尝试了ScanningResourceConfig
和ClassNameResourceConfig
- 两者都是除非在类级别有@Path
,否则无法将该类作为资源加载。
我猜一个(丑陋的)解决方法是在类WidgetResource
类和WidgetsResource
类之间拆分方法。我认为这是一个糟糕的解决方案,因为这两种方法在同一个类中共享资源,但我真的需要REST-ful localhost/widget
(对于单个实体)和localhost/widgets
(对于复数)。< / p>
我错过了什么 - 如果我只是@Path
注释方法(我无法让它工作),我有什么办法让泽西拿起这个类作为资源类,如果不能我强制绝对映射(@Path(/widget/{id})
)或一些相对映射(@Path(../widget/id
) - 这些都不是现实中的工作 - 只是我所追求的类比。谢谢!
答案 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}"
。
我不会在你的道路中在复数和单数之间切换。由于您为两者访问相同类型的资源,因此您的根应该是相同的。第二种形式只是更多地指定它 - 一种基于矢量的方法来获得更具体的信息。