Java jax-rs@path表达式中的路径参数需要用斜杠分隔吗?

Java jax-rs@path表达式中的路径参数需要用斜杠分隔吗?,java,jax-rs,Java,Jax Rs,我正在检查一个JAX-RSSpringBoot微服务中的一些代码,我正在着手处理这些代码。我看到了以下内容(修改): 这个@Path值看起来很奇怪。它不是在字符串中使用显式“/”标记,而是试图通过正则表达式来实现。我猜这是可行的,因为这是现有的代码,但这真的是明智的吗?是否有任何理由认为这是必要的 我想一个类似的有问题的例子是: @Path("foo{bar: (/[^/]+?)?}") 是否有任何理由认为这比简单的更好: @Path("foo/{bar}") 具体来说,参考资料一章下的“U

我正在检查一个JAX-RSSpringBoot微服务中的一些代码,我正在着手处理这些代码。我看到了以下内容(修改):

这个@Path值看起来很奇怪。它不是在字符串中使用显式“/”标记,而是试图通过正则表达式来实现。我猜这是可行的,因为这是现有的代码,但这真的是明智的吗?是否有任何理由认为这是必要的

我想一个类似的有问题的例子是:

@Path("foo{bar: (/[^/]+?)?}")
是否有任何理由认为这比简单的更好:

@Path("foo/{bar}")
具体来说,参考资料一章下的“URI模板”部分给出了答案:

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

@Path("widgets/{path:.+}")
public class Widget {
  ...
}
在上述示例中,
小部件
资源类将与路径以
小部件
开头并包含至少一个以上路径段的任何请求相匹配;
path
参数的值将是
widgets
后面的请求路径。例如,给定请求路径
widgets/small/a
,路径的值将为
small/a

因此,如果不提供customn regex,默认边界是
/

因此,这个复杂的正则表达式是不必要的
@Path(“{foo}/{bar}”
很好

从技术上讲,它并不完全相同;正则表达式强制
{bar}
包含领先的
/
。它值得需要额外视觉分析的正则表达式的复杂性吗?我认为不值得。

如果你只是使用

@Path("foo/{bar}")
然后调用
/foo
将导致404,因为
/
是静态的,它需要请求
/foo/
。但是当它位于
条的regex中时,它将使其成为可选的

@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.
    }
}

这是我在这种情况下所能看到的唯一真正的好处。可能需要更多的上下文,可能需要一些作者关于他们试图完成什么的文档化评论。但是总体而言,在我看来,代码看起来不必要地过于复杂。

这不意味着为“bar”属性提取的值将包含一个初始“/”?是否有某些原因使它必须在regexp中?如果不是,那么它就不是可选的。
@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.
    }
}