【问题标题】:How is dispatching controlled in JAX-RS?在 JAX-RS 中如何控制调度?
【发布时间】:2010-12-11 18:15:52
【问题描述】:

我正在使用 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


    【解决方案1】:

    优先规则

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

    1. 排序的主键是完整URI中文字字符的个数 匹配模式。排序是按降序排列的。在我们模棱两可的例子中, getCustomer() 的模式有 11 个文字字符:/customers/。获取广告 dress() 方法的模式有 18 个文字字符:/customers/ 加上地址。 因此,JAX-RS 提供者会在之前尝试匹配 getAddress() 的模式 getCustomer()。

    2. 排序的次键是嵌入的模板表达式的个数 在模式内——即 {id} 或 {id : .+}。这种排序是按降序排列的。 3.排序的第三键是非默认模板表达式的数量。一种 默认模板表达式是一个没有定义正则表达式的表达式——即 是,{id}​​。

    【讨论】:

      【解决方案2】:

      有一个定义明确的算法,JAX-RS 规范的第 3.7.1 节描述了它。坦率地说,我觉得这个解释很不透明 - 所以阅读它,我无法回答你的问题。

      但是,我刚刚找到了选择算法的CXF overview,这似乎表明优先规则确实可以让你做你想做的事。

      【讨论】:

        猜你喜欢
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多