Jax-RS中的可选@PathParam

45

我有一个服务,路径的最后一部分是可选的,用户既可以输入/mypath/,也可以输入/mypath/param1/

我试图使用正则表达式来过滤路径的最后一部分:

@Path("/mypath{param1: (/param1)?}")

我使用RestEasy作为我的JAX-RS提供者,在Tomcat中代码按预期工作,但当我在JBoss上部署它时,如果我不提交可选部分,我会收到405返回代码。

我在这里做错了什么,或者不可能以便携的方式完成这个任务?


1
参见 - Paul Samsotha
4个回答

47
问题出在冒号前面缺少空格:
@Path("/mypath{param1: (/param1)?}")

应该是:

@Path("/mypath{param1 : (/param1)?}")

显然这是一个bug,因为规范中表示冒号周围的空格是可选的。我也发现我不是第一个被这个bug咬到的人


3
这在我的情况下无效,但是这个方法有效。 - Neeraj Jain
1
@NeerajJain,我的问题涉及到RestEasy,而你提供的链接是关于Jersey的。 - Fábio
param1的值包含斜杠(/)。有没有一种不需要在代码中手动切割斜杠的方法来不包含该斜杠呢? - AlikElzin-kilaka

11
在我的情况下,我必须使用另一个表达式:@Path('/mypath/{param1 : (\\w+)?}'),否则您必须清除参数。

2

请确认是否已经定义了一个接受不同方法的/mypath路径,这可能是您收到405(方法不允许)错误的原因。此外,当您拥有可选参数时,最好将它们设置为查询参数。


这是我遇到的错误。我在根目录下有一个 GET 请求和一个可选的文件名为参数的 POST 请求。因此,GET 和 POST 请求发生了冲突。 - QuirkyBit

-12

使用 Dropwizard 1.0 和 Java8,您可以使用 Optional

@Path("/news")
getLastNews(@QueryParam("topicId") String topicId, @QueryParam("limit") Optional<Integer> limit) 

它将会对两者都做出响应

/news?topicId=123213?limit=200

并且

/news?topicId=123213

5
这是有关于 @Path 而不是 @QueryParam - Zarathustra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接