Jax-RS 重载 methods/paths 执行顺序

Jax-RS overloading methods/paths order of execution

我正在为我的应用编写 API,我对 Jax-RS 如何处理某些场景感到困惑

比如我定义了两条路径:

@Path("user/{name : [a-zA-Z]+}")

@Path("user/me")

我指定的第一条路径明确包含第二条路径,因为正则表达式包含所有字母 a-z。但是,该程序似乎对此没有问题。是因为它默认为最具体的路径(即 /me 然后查找正则表达式)吗?

此外,如果我将两个正则表达式定义为有一些重叠的路径,会发生什么情况。是否有将被调用的默认方法?

假设我想为三种不同的方法创建三个路径:

@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \d+}")
@Path("user/me")

这是最好的吗practice/appropriate?它如何知道调用哪个方法?

提前感谢您的澄清。

这是在the spec中"Matching Requests to Resource Methods"

Sort E using (1) the number of literal characters in each member as the primary key (descending order), (2) the number of capturing groups as a secondary key (descending order), (3) the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) as the tertiary key (descending order), ...

候选方法按指定顺序排序 "key"。我用粗体突出显示它们。

第一个排序键是文字字符数。所以对于这三个

@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \d+}")
@Path("user/me") 

如果请求的 URI 是 ../user/me,将始终选择最后一个,因为它具有最多的文字字符(7,/ 计数)。其他人只有5个。

除了 ../users/me 之外,其他 ../users/.. 都将取决于正则表达式。在您的情况下,一个只匹配数字,一个只匹配字母。这两个正则表达式无法重叠。所以它会相应地匹配。

现在只是为了好玩,假设我们有

@Path{"user/{name : .*}")
@Path("user/{id : \d+}")
@Path("user/me")

如果您查看前两个,我们现在有重叠的正则表达式。第一个将匹配所有数字,第二个也是如此。那么会用到哪一个呢?我们不能做任何假设。这是一个未指定的歧义级别,我已经看到来自不同实现的不同行为。 AFAIK,没有 "best matching" 正则表达式的概念。要么匹配要么不匹配。

但是如果我们希望始终首先检查 {id : \d+} 怎么办?如果它与数字匹配,那么应该选择它。我们可以根据规范对其进行破解。规范中提到的 "capturing groups" 基本上就是 {..}。第二个排序键是捕获组的数量。我们破解它的方法是添加另一个 "optional" 组

@Path{"user/{name : .*}")
@Path("user/{id : \d+}{dummy: (/)?}")

现在后者有更多的捕获组,所以它总是在排序中领先。它所做的只是允许一个可选的 /,这不会真正影响 API,但确保如果请求 URI 全部是数字,将始终选择此路径。

你可以看到一些测试用例的讨论