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