Jersey可以根据请求URI通过特定构造函数构建资源类吗?

时间:2014-06-01 15:29:16

标签: java jersey jax-rs

我有一个班级

@Path("/foo")
public class Foo {

    public Foo() {
    }

    public Foo(int n) {
    }

    @GET
    @Produces(MediaType.TEXT_HTML)
    @Path("/isAlive")
    public String isAlive() {
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/getConfigFromDB")
    public Response getConfigFromDB(Request) {
    }

假设这是对此Web应用程序的第一次调用,并且必须首次构建该类。如果路径是"http://localhost/foo/isAlive",我可以配置Jersey选择第二个构造函数吗?如果请求路径是"http://localhost/foo/getConfigFromDB",我可以配置第一个构造函数吗?

2 个答案:

答案 0 :(得分:2)

您可以自行管理资源实例化,覆盖Application#getSingletons

@ApplicationPath("/r")
public class RestApplication extends Application {

    @Override
    public Set<Object> getSingletons() {
        Foo foo = new Foo();
        Bar bar = new Bar(42);
        return new HashSet<Object>(Arrays.asList(foo, bar));
    }

}

但是因此你需要两个课程,每个课程都有完整的路径:

@Path("/foo/isAlive")
public class Foo {

    public Foo() {}

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response isAlive() {
        return Response.ok("foo is alive").build();
    }

}

@Path("/foo/getConfigFromDB")
public class Foo2 {

    private int n;

    public Foo2(int n) {
        this.n = n;
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response isAlive() {
        return Response.ok("bar initialized with " + n).build();
    }

}

您还可以使用Subresource

@Path("/foo")
public class Foo {

    public Foo() {}

    @GET
    @Path("/isAlive")
    @Produces(MediaType.TEXT_PLAIN)
    public Response isAlive() {
        return Response.ok("foo is alive").build();
    }

    @Path("/getConfigFromDB")
    @Produces(MediaType.TEXT_PLAIN)
    public Bar getConfigFromDB() {
        return new Bar(4711);
    }

}

public class Bar {

    private int n;

    public Bar(int n) {
        this.n = n;
    }

    @GET
    public Response get() {
        return Response.ok("Bar initialized with " + n).build();
    }

}

但如果你的问题是关于在第二种方法中获取身份验证信息,就像你在评论中写的那样,我也不会使用构造函数。 有关其他一些示例,请参阅this answer

答案 1 :(得分:1)

AFAIK,资源实例是JAX-RS实现的责任,资源类必须有一个空构造函数或构造函数,其参数注释为@Context@Header,{{1} },@PathParam@CookieParam@MatrixParam@QueryParam。此外,将为每个传入请求创建一个新的Resource类实例。

如果您的应用程序部署在JavaEE容器上或包含Spring,您可以使用@PathParam注释来访问您的应用程序的其他服务,如果这可以帮助您。