使用Jersey中的JaxRS @Path批注匹配最后一个路径元素

时间:2013-08-29 14:55:28

标签: java regex jersey jax-rs

使用以前版本的Jersey(~1.12),我曾经将文字路径元素“data”与一个注释匹配(如果它出现在路径的末尾),另一个注释是否在其他地方:

@Path("data$")
public Object getDataResource(@Context UriInfo uriInfo) {
    // Matched when 'data' is the last path element
    ...
}

@Path("{name}")
public Object getNamedResource(@Context UriInfo uriInfo) {
    // Matched when 'data' is not the last path element
    ...
}

在1.12和1.17之间的某个时刻,此行为已更改,并且在将模式应用于传入URI之前,'$'字符现在已转义。现在第一个方法(getDataResource)永远不会匹配。

例如,在匹配http://.../data/data时,我希望getNamedResource匹配第一个“数据”,getDataResource匹配第二个“数据”。相反,getNamedResource现在匹配两者。

  1. 我是否可以恢复我负责逃避正则表达式的旧行为?
  2. 是否有新的/更好/其他技术只匹配URI上的最后一个路径元素?

1 个答案:

答案 0 :(得分:0)

我发现的最佳解决方案是手动检测第二种方法何时匹配最后一个路径元素并手动委托给第一个路径元素。

@Path("{name}")
public Object getNamedResource(@Context UriInfo uriInfo) {
    boolean lastElement = uriInfo.getMatchedURIs()
                           .iterator().next().equals(uriInfo.getPath());
    if (lastElement && "data".equals(name)) {
        return getDataResource(uriInfo);
    }
    ...
}

对我的特定问题来说并不是一个糟糕的解决方案,但我仍然感到沮丧的是,泽西岛在没有先问我的情况下逃脱了我的模式。