我们可以为同一个REST方法提供多个@Path注释吗?

2022-09-01 04:58:14

我们可以为同一个REST方法设置多个注释,即执行的方法相同,但它是在访问多个URL时执行的吗?@Path

例如:我想在 和 上运行该方法。searchNames()http://a/b/chttp://a/b


答案 1

不能在单个方法上具有多个批注。它会导致“重复批注”语法错误。@Path

但是,有许多方法可以有效地将两条路径映射到一个方法。

批注中的正则表达式@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 过滤器重写 URL

如果您经常需要这样的功能,我建议您使用servlet过滤器拦截传入的请求并动态重写路径。这应该可以帮助您将所有重定向保存在一个位置。理想情况下,您可以使用现成的库。UrlRewriteFilter可以做到这一点,只要你对BSD许可证没问题(查看他们的谷歌代码网站了解详情)

另一种选择是在 Java 应用程序前面设置代理来处理此问题。您可以设置Apache服务器以提供基本的缓存和重写规则,而不会使您的Java代码复杂化。


答案 2

正如Tom的答案中所解释的那样,您不能在单个方法上使用多个注释,因为在编译时会遇到。@Patherror: 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();
}

如果遇到多个重载方法具有签名的情况,也可以使用更多不同的方法名称。