我正在检查我正在开始工作的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}")
答案 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代码看起来不必要地过于复杂。