我们可以为同一个REST方法提供多个@Path注释吗?
我们可以为同一个REST方法设置多个注释,即执行的方法相同,但它是在访问多个URL时执行的吗?@Path
例如:我想在 和 上运行该方法。searchNames()
http://a/b/c
http://a/b
我们可以为同一个REST方法设置多个注释,即执行的方法相同,但它是在访问多个URL时执行的吗?@Path
例如:我想在 和 上运行该方法。searchNames()
http://a/b/c
http://a/b
不能在单个方法上具有多个批注。它会导致“重复批注”语法错误。@Path
但是,有许多方法可以有效地将两条路径映射到一个方法。
JAX-RS 中的注释接受参数,可以使用正则表达式限制其值。@Path
此注释:
@Path("a/{parameter: path1|path2}")
将使该方法能够通过对 和 的请求来访问。如果需要使用子路径,请转义斜杠:/a/path1
/a/path2
{a:path1\\/subPath1|path2\\/subPath2}
或者,您可以设置重定向。下面是通过定义另一个子资源在泽西岛(JAX-RS 的参考实现)中执行此操作的方法。这只是一个例子,如果您更喜欢处理重定向的不同方式,请随时使用它。
@Path("basepath")
public class YourBaseResource {
//this gets injected after the class is instantiated by Jersey
@Context
UriInfo uriInfo;
@Path("a/b")
@GET
public Responce method1(){
return Response.ok("blah blah").build();
}
@Path("a/b/c")
@GET
public Response method2(){
UriBuilder addressBuilder = uriInfo.getBaseUriBuilder();
addressBuilder.path("a/b");
return Response.seeOther(addressBuilder.build()).build();
}
}
如果您经常需要这样的功能,我建议您使用servlet过滤器拦截传入的请求并动态重写路径。这应该可以帮助您将所有重定向保存在一个位置。理想情况下,您可以使用现成的库。UrlRewriteFilter
可以做到这一点,只要你对BSD许可证没问题(查看他们的谷歌代码网站了解详情)
另一种选择是在 Java 应用程序前面设置代理来处理此问题。您可以设置Apache服务器以提供基本的缓存和重写规则,而不会使您的Java代码复杂化。
正如Tom的答案中所解释的那样,您不能在单个方法上使用多个注释,因为在编译时会遇到。@Path
error: duplicate annotation
我认为解决这个问题的最简单方法是使用方法重载:
@Path("{foo}")
public Response rest(@PathParam("foo") final String foo) {
return this.rest(foo, "");
}
@Path("{foo}/{bar}")
public Response rest(@PathParam("foo") final String foo,
@PathParam("bar") final String bar) {
return Response.ok(foo + " " + bar).build();
}
如果遇到多个重载方法具有签名的情况,也可以使用更多不同的方法名称。