【问题标题】:JAX-RS: Multiple pathsJAX-RS:多条路径
【发布时间】:2011-06-14 14:49:11
【问题描述】:

有可能做这样的事情吗?

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。

【问题讨论】:

  • 我假设你想要两条路径去同一个方法?

标签: java jax-rs


【解决方案1】:

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

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();
    }
 }

【讨论】:

    【解决方案2】:

    关于路径注解的一些额外细节...

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

    {" variable-name [ ":" regular-expression ] "} 
    

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

    @Path("/{a:v1|v2}")
    @Produces("text/*")
    public class BlahResource {
    
        @GET
        @Path("/blah")
        public Response m1() {
            return Response.ok("blah").build();
        }
    }
    

    请注意,“BlahResource”类已使用路径“/v1”或“/v2”声明,使得资源可通过以下方式访问:

    $ curl localhost:8080/v1/blah
    blah
    

    还有

    $ curl localhost:8080/v2/blah
    blah
    

    【讨论】:

    【解决方案3】:

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

    更新: 查看 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();
    }
    

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

    JSR311 API

    Jersey

    【讨论】:

    • 用resteasy也可以吗?
    • 实际上没有理由你的答案不是一个好答案,事实上我认为它比这里的大多数方法都好,因为这两种方法可以委托给一个负责完成工作的服务。这使您的代码更易于维护。
    【解决方案4】:

    【讨论】:

    • 如果有人有兴趣,我用球衣 (jax-rs) 试了一下,效果很好。
    • @Path 正则表达式支持在 JAX-RS (JSR-339) 规范中指定(至少在 2.0 版中),因此任何实现都应该支持它。
    • 如果您使用复合路径,我将不得不转义斜杠,例如 {a:path1\\/subPath1|path2\\/subPath2}
    • 你知道我怎样才能使斜杠“/”成为可选的吗?这意味着要么匹配“/abc”,要么不匹配。
    • 我想匹配“/”或“/path”。
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多