jax-rs @Path表达式中的路径参数是否需要斜杠分隔?

时间:2018-04-27 22:31:27

标签: java jax-rs

我正在检查我正在开始工作的JAX-RS springboot微服务中的一些代码。我看到了以下(修改过):

@POST
@Path("{foo: ([^/]+?)?}{bar: (/[^/]+?)?}")
public Response doit(
        @PathParam("foo") String foo,
        @PathParam("bar") String bar,
        @RequestBody UpdateRequest updateRequest, @Context HttpHeaders httpHeaders);

@Path值看起来很奇怪。而不是明确" /"字符串中的标记,它试图通过正则表达式。我猜这可行,因为这是现有的代码,但这是否可取?有什么理由认为这是必要的吗?

我想一个类似的可疑例子是这样的:

@Path("foo{bar: (/[^/]+?)?}")

这有什么理由比简单更好:

@Path("foo/{bar}")

2 个答案:

答案 0 :(得分:0)

JAX-RS specification,特别是参考资料章节下的“URI模板”部分,有答案:

  

模板参数可以选择指定用于匹配其值的正则表达式。默认值匹配任何文本并终止于路径段的末尾,但其他值可用于改变此行为,例如:

@Path("widgets/{path:.+}")
public class Widget {
  ...
}
     

在上面的示例中,Widget资源类将匹配其路径以widgets开头且至少包含一个路径段的任何请求; path参数的值将是widgets之后的请求路径。例如。给定请求路径widgets/small/a,路径的值将为small/a

因此,如果您不提供自定义正则表达式,则默认边界为/

因此,复杂的正则表达式是不必要的。 @Path("{foo}/{bar}"没问题。

从技术上讲,它并不完全相同;正则表达式强制{bar}包括前导/。值得复制的正则表达式需要额外的视觉分析吗?不在我看来。

答案 1 :(得分:0)

如果您刚刚使用

@Path("foo/{bar}")

然后调用/foo将导致404,因为/是静态的,并且需要请求/foo/。但是当它在bar的正则表达式中时,它会使它成为可选项。所以这个例子

@Path("foo{bar: (/[^/]+?)?}")

允许您从同一资源方法访问父资源子资源。作为一个更现实的例子,说你有

@Path("customers{id: (/[^/]+?)?}")

有了这个,我们将有一个资源方法可以处理访问集合资源单个资源。与拥有两个独立的资源方法相反,每种情况都有一个。例如

@GET
@Path("customers{id: (/[^/]+?)?}")
public Response get(@PathParam("id") String id) {
    if (id == null) {
        return collection customers collection
    } else {
        fetch custom by id and return customer.
    }
}

这是我在这种情况下可以看到的唯一真正好处。可能需要更多的背景,也许还有一些记录作者关于他们想要完成什么的评论。总的来说,IMO代码看起来不必要地过于复杂。