在JAX-RS中如何控制调度?

问题描述 投票:2回答:2

我正在使用RESTeasy编写RESTful Web服务。这是JAX-RS的实现。您使用单个@Path注释对类或方法进行注释。正则表达式用于获取路径参数。例如

@Path("/foo{varname:.*}/bar")

匹配所有以“ / foo”开头,以“ / bar”结尾且中间包含任何内容的模式。介于两者之间的任何东西都分配给名为varname的参数。

某些框架(例如Django)具有将按顺序尝试的正则表达式和方法的列表。例如/john/q/smith、/john/{.*}/smith、/john/{.*}/{.*}。 “ / john / henry / smith”与第二个和第三个匹配,但是第二个将被分派,因为它是找到的第一个匹配项。

在JAX-RS中是否可能,或者类和方法没有固有的顺序?对于/john/{.*}/{.*},您是否需要编写一个正则表达式,表示/ john / anything / anythingbutsmith?您每次更改其他项目时都必须进行更改。

jax-rs resteasy servlet-dispatching
2个回答
2
投票

有一个定义明确的算法,JAX-RS规范的3.7.1节对此进行了描述。坦率地说,我发现解释不透明-因此阅读它,我无法回答您的问题。

但是,我刚刚发现选择算法的CXF overview,这似乎表明优先级规则确实确实可以让您执行所需的操作。


0
投票

优先规则

JAX-RS规范定义了严格的排序和匹配URI表达式的优先规则,并且基于最具体的规则匹配获胜算法。 JAX-RS提供程序收集已部署的URI表达式集并根据以下逻辑对其进行排序:

  1. 排序的主键是完整URI中文字字符的数量匹配模式。排序是降序排列。在我们模棱两可的例子中,getCustomer()的模式包含11个文字字符:/ customers /。 getAddress()方法的模式包含18个文字字符:/ customers /以及地址。因此,JAX-RS提供者将尝试在匹配getAddress()的模式之前getCustomer()。

  2. 排序的辅助键是嵌入的模板表达式的数量在模式中,即{id}或{id:。+}。这种排序是降序排列。3.排序的三级键是非默认模板表达式的数量。一种默认模板表达式是未定义正则表达式的模板,即是{id}。

© www.soinside.com 2019 - 2024. All rights reserved.