Java JAX-RS:多路径

Java JAX-RS:多路径,java,jax-rs,Java,Jax Rs,有可能做那样的事吗 import javax.ws.rs.GET; import javax.ws.rs.Path; public class xxx { @GET @Path(value = "path1") public Response m1() { ... } @GET @Path(value = "path2") public Response m1() { ... } } 顺便说一句

有可能做那样的事吗

import javax.ws.rs.GET;
import javax.ws.rs.Path;

public class xxx
{
  @GET
  @Path(value = "path1")
  public Response m1()
  {
    ...
  }

  @GET
  @Path(value = "path2")
  public Response m1()
  {
    ...
  }
}

顺便说一句,我正在使用RESTEasy。

是的,您可以这样做,尽管您必须重命名您的方法,以便它们的签名不同

更新:检查Dieter Cailliau的答案,
@Path(“/{a:path1 | path2}”)
可能就是你想要的

您可以查看JSR-311的API及其名为“jersey”的参考实现:

从resteasy文档:

有关路径注释的一些额外详细信息

作为先前的响应状态,要在带注释的路径声明映射中使用的正则表达式:

{" variable-name [ ":" regular-expression ] "} 
您可以声明多个路径,但也有一个路径层次结构,我不太清楚,其中类注释的路径作为以下方法路径注释的前缀。您可以编写下面的类以获得一个简明的多路径选项,该选项可能对资源版本控制有用

@Path("/{a:v1|v2}")
@Produces("text/*")
public class BlahResource {

    @GET
    @Path("/blah")
    public Response m1() {
        return Response.ok("blah").build();
    }
}
请注意,已使用路径“/v1”或“/v2”声明了类“BlahResource”,使资源可访问为:

$ curl localhost:8080/v1/blah
blah
而且

$ curl localhost:8080/v2/blah
blah

您可以使用子资源将两条路径映射到同一资源:

public class MySubResource {
    @GET
    public Response m1() {
        return Response.ok("blah").build();
    }
}

@Path("/root")
public class MyRootResource {

    @Path("/path1")
    public MySubResource path1() {
        return new MySubResource();
    }

    @Path("/path2")
    public MySubResource path2() {
        return new MySubResource();
    }
 }

也可以使用resteasy?实际上,没有理由认为您的答案不好,事实上,我认为它比这里的大多数方法都好,因为这两种方法可以委托给负责完成工作的单个服务。这使您的代码更易于维护。如果有人感兴趣,我在jersey(jax rs)上尝试了这一点,并且效果很好。@jax-rs(JSR-339)规范(至少在版本2.0中)中指定了路径正则表达式支持,因此任何实现都应该支持它。如果您使用复合路径,我必须避免使用类似的斜杠{a:path1\\/subPath1 | path2\\\/subPath2}你知道我如何使斜杠“/”可选吗?这意味着它要么匹配“/abc”,要么不匹配。我想匹配“/”或“/path”。这里可以找到有点混乱的JAX-RS API规范。目前,swagger不支持它。我假设你想要两条路径指向同一个方法?
$ curl localhost:8080/v2/blah
blah
public class MySubResource {
    @GET
    public Response m1() {
        return Response.ok("blah").build();
    }
}

@Path("/root")
public class MyRootResource {

    @Path("/path1")
    public MySubResource path1() {
        return new MySubResource();
    }

    @Path("/path2")
    public MySubResource path2() {
        return new MySubResource();
    }
 }