JAX-RS - 带正则表达式的@Path Param

时间:2013-01-11 22:42:45

标签: regex path jax-rs

我正在尝试使用JSX-RS实现一项服务,我有一种情况,在这种情况下,应该通过一种方法来满足不同版本号的多种类型的请求。

@Path("/url1/url2{version: [[/v][0-9][.][0-9]]*}")

这应该迎合 -

/url1/url2
/url1/url2/v1
/url1/url2/v1.2

其中版本分别为0,1和1.2。

我有正确的正则表达式,但代码似乎不接受它 ((/v[0-9])(.[0-9])?)?我在这里很困惑。

我需要在v之后和小数点(。)之后将其限制为仅一位数,并且我只需要一次出现/ v *。例如 -

/ur1/url2/v1v1不允许

另外我想明智地知道,如果我有一个带小数点的网址,是否会花费更多时间来解析它。我必须对其进行网址编码吗?任何其他建议将不胜感激。

替代方法适用于每个版本,我有@path param的单独方法。这最终是最好的解决方案吗?

非常欢迎任何建议或想法!

1 个答案:

答案 0 :(得分:1)

好的,这就是我这样做的方式:

首先,v是可选的,因为您必须接受/url1/url2之类的模式。所以,我会从:

开始
(/v)?

?表示零次或一次。

现在,如果你输入一个/v,那么你必须有一个版本数字(即/v1),但这只是你把/v放在第一位,对吗? / p>

有点像:(/v\d)?

无需为数字\d指定量词,因为默认值为1。由于?量词,整个组可以出现零次或一次。

现在,如果您输入一个版本数字,那么您可以选择将第二个版本数字用点分隔(即/v1.1)。但这仅在您首先使用版本号时才有效,并且此组是可选的。如果看起来它应该只显示一次,那么我们可以再次使用量词?

所以,有点像这样:

(/v\d(\.\d)?)?

请注意,我使用了\.来表示我们希望这里有一个“点”。之所以这样,是因为.是一个预定义的正则表达式字符类,它代表任何字符,因此您必须将其转义以表示您期望"."

因此,这适用于我提供的所有测试方案。