0

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

@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 上的最后一个路径元素?
4

1 回答 1

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);
    }
    ...
}

对我的特定问题的解决方案不错,但我仍然感到沮丧的是,泽西在没有先问我的情况下就逃避了我的模式。

于 2013-08-29T14:55:28.277 回答