JAX-RS:多条路径

ter*_*207 42 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 m2()
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用RESTEasy.

小智 78

@Path("/{a:path1|path2}")
Run Code Online (Sandbox Code Playgroud)

来自resteasy docs:http://docs.jboss.org/resteasy/docs/1.0.2.GA/userguide/html_single/index.html#_Path_and_regular_expression_mappings

  • 如果有人有兴趣我用jersey(jax-rs)试过这个并且它有效. (23认同)
  • 如果你正在使用复合路径,我将不得不像{a:path1 \\/subPath1 | path2 \\/subPath2}那样转义斜杠 (3认同)
  • JAX-RS (JSR-339) 规范(至少在版本 2.0 中)指定了 @Path 正则表达式支持,因此任何实现都应该支持它。 (2认同)

fas*_*seg 17

是的,你可以这样做,虽然你必须重命名你的方法,以便他们的签名是不同的.

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

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

    @GET
    @Path("path2")
    public Response m2(){
        return this.m1();
}
Run Code Online (Sandbox Code Playgroud)

你可以检查JSR-311的API及其名为"jersey"的参考实现:

JSR311 API

新泽西


Ope*_*ned 10

关于Path注释的一些额外细节......

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

{" variable-name [ ":" regular-expression ] "} 
Run Code Online (Sandbox Code Playgroud)

您可以声明多个路径,但是还有一个路径层次结构对我来说不是很明显,其中类注释路径为前面的方法路径注释添加前缀.有人可能会为简洁的多路径选项编写以下类,这可能对资源版本控制很有用.

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

    @GET
    @Path("/blah")
    public Response m1() {
        return Response.ok("blah").build();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,已使用路径"/ v1"或"/ v2"声明类"BlahResource",使资源可访问为:

$ curl localhost:8080/v1/blah
blah
Run Code Online (Sandbox Code Playgroud)

并且

$ curl localhost:8080/v2/blah
blah
Run Code Online (Sandbox Code Playgroud)