Regex Jax-RS重载方法/路径执行顺序
我正在为我的应用程序编写一个API,我对Jax-RS如何处理某些场景感到困惑 例如,我定义了两条路径:Regex Jax-RS重载方法/路径执行顺序,regex,api,rest,jax-rs,Regex,Api,Rest,Jax Rs,我正在为我的应用程序编写一个API,我对Jax-RS如何处理某些场景感到困惑 例如,我定义了两条路径: @Path("user/{name : [a-zA-Z]+}") 及 我指定的第一条路径显然包含第二条路径,因为正则表达式包含所有字母a-z。然而,该计划似乎没有这方面的问题。是否因为它默认为最特定的路径(即/me,然后查找正则表达式) 此外,如果我将两个正则表达式定义为具有某些重叠的路径,会发生什么。是否有将被调用的默认方法 假设我想为三种不同的方法创建三条路径: @Path{"user/
@Path("user/{name : [a-zA-Z]+}")
及
我指定的第一条路径显然包含第二条路径,因为正则表达式包含所有字母a-z。然而,该计划似乎没有这方面的问题。是否因为它默认为最特定的路径(即/me,然后查找正则表达式)
此外,如果我将两个正则表达式定义为具有某些重叠的路径,会发生什么。是否有将被调用的默认方法
假设我想为三种不同的方法创建三条路径:
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")
这是最佳做法/适当做法吗?它如何知道调用哪个方法
提前感谢您的澄清。这在“将请求匹配到资源方法”中
使用(1)每个成员中的文字字符数作为主键进行排序(降序),(2)捕获组数作为辅助键进行排序(降序),(3)使用非默认正则表达式的捕获组数(即非“([^/]+?)”作为第三键(降序)
结果是候选方法按指定的顺序“键”排序。我用粗体突出显示它们
第一个排序键是文字字符数。那么对于这三个
@Path{"user/{name : [a-zA-Z]+}")
@Path("user/{id : \\d+}")
@Path("user/me")
如果请求的URI是。/user/me
,则将始终选择最后一个URI,因为它具有最多的文字字符(7,/
计数)。其他的只有5个
除了。/users/me
之外,任何其他。
都将取决于正则表达式。在你的例子中,一个只匹配数字,一个只匹配字母。这两个正则表达式不可能重叠。因此,它将相应地匹配
现在只是为了好玩,假设我们有
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")
如果你看前两个,我们现在有重叠的正则表达式。第一个将匹配所有数字,第二个也一样。那么将使用哪一个呢?我们不能做任何假设。这是一个未指定的模糊级别,我在不同的实现中看到了不同的行为。顺便说一句,没有“最佳匹配”正则表达式的概念。要么匹配,要么不匹配
但是如果我们希望总是首先检查{id:\\d+}
,该怎么办呢。如果它与数字匹配,则应选择该选项。我们可以根据规范来破解它。该规范讨论了“捕获组”,基本上是{..}
s。第二个排序键是捕获组的数量。我们破解它的方法是添加另一个“可选”组
现在后者有更多的捕获组,因此它将始终在同类中处于领先地位。它所做的只是允许一个可选的/
,这不会真正影响API,但可以确保如果请求URI是所有数字,则始终选择此路径
您可以看到一些测试用例的讨论答案很好!谢谢你,我正试图找到规格,但运气不好。
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}")
@Path("user/me")
@Path{"user/{name : .*}")
@Path("user/{id : \\d+}{dummy: (/)?}")