为什么QueryParams的存在会影响Jersey匹配顺序?

时间:2013-04-26 23:32:42

标签: java rest jersey jax-rs

我有两个看起来像这样的泽西方法

@GET
@Path("/mine")
@Produces(MediaType.APPLICATION_JSON)
List<MyStuff> getAllMyStuff();

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
MyStuff getMyStuff(@PathParam("id"));

在这种情况下,我可以请求/ mine和'getAllMyStuff',或者请求/ 123并获得正确的个人资料。但是,我有一些可选的查询参数,我想在“我的”路径上使用,这样做似乎扔了一个循环的球衣。当我改变'我的'时,就像

@GET
@Path("/mine")
@Produces(MediaType.APPLICATION_JSON)
List<MyStuff> getAllMyStuff(@QueryParam("offset") int offset, @QueryParam("limit") int limit);

调用'/ mine'最终被映射到ID为'mine'的'getMyStuff'方法。

对我来说,简单地列出这些查询参数会像这样影响映射,这似乎很奇怪。有没有办法解决它?

2 个答案:

答案 0 :(得分:1)

事实证明,问题实际上与我在界面和实现中声明注释的方式有关。

我有一个方法,如:

@GET
@Path("/mine")
@Produces(MediaType.APPLICATION_JSON)
List<MyStuff> getAllMyStuff(@QueryParam("offset") int offset, @QueryParam("limit") int limit);

这样的实现
  

列出getAllMyStuff(@QueryParam(“offset”)int offset,   @QueryParam(“limit”)int limit);

显然在实现方法上有任何泽西注释会最终否定接口上的'继承'。只需将我的实现改为

即可
List getAllMyStuff(int offset, int limit);

解决了这个问题。谢谢你的帮助!

答案 1 :(得分:0)

我相信你的问题是&#34;我的&#34;匹配getMyStuff和getAllMyStuff方法。要消除歧义,您可以:

选项1:使用&#34; /&#34;引用该集合,&#34; / {id}&#34;对于单个项目##

@GET
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
List<MyStuff> getAllMyStuff(@QueryParam("offset") int offset, @QueryParam("limit") int limit);

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
MyStuff getMyStuff(@PathParam("id"));

选项2:使用常规表达式来限定可能的id值##

如果您需要将/ mine保留为路径,则可以进一步指定id的有效值,以便不会发生冲突。

例如,如果您的所有ID都是数字:

@GET
@Path("/mine")
@Produces(MediaType.APPLICATION_JSON)
List<MyStuff> getAllMyStuff(@QueryParam("offset") int offset, @QueryParam("limit") int limit);

@GET
@Path("/{id: [0-9]?}")
@Produces(MediaType.APPLICATION_JSON)
MyStuff getMyStuff(@PathParam("id"));

注意:我不确定我是否正确使用正则表达式。