Java Jersey能否通过基于请求URI的特定构造函数构建资源类?

Java Jersey能否通过基于请求URI的特定构造函数构建资源类?,java,jersey,jax-rs,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

我有一节课

@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应用程序的第一次调用,并且必须第一次构造该类。如果路径为
,是否可以配置Jersey以选择第二个构造函数http://localhost/foo/isAlive“
和请求路径为
时的第一个构造函数”http://localhost/foo/getConfigFromDB“

好吧,资源实例是JAX-RS实现的责任,并且资源类必须有一个空构造函数或一个带有参数的构造函数,这些参数用
@Context
@Header
@PathParam
@CookieParam
@MatrixParam
@QueryParam
@PathParam
注释。此外,将为每个传入请求创建资源类的新实例


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

您可以自己管理资源实例化,覆盖:

您还可以使用:

但是,如果您的问题是在第二个方法中获取身份验证信息,正如您在注释中所写的那样,我无论如何都不会使用构造函数。
请参阅其他一些示例。

如果我将Jersey与Spring集成,并让Spring管理类的创建,我是否能够实现我想要的行为?我不确定这一点。请问您为什么需要这样的第二个构造函数?作为一种解决方法,您能否从使用
@Inject
注入到资源中的服务bean中检索
n
值(在secod构造函数中传递)?我不需要另一个构造函数。这只是试图解决我的问题。问题是我们的前端都继承了一个
isAlive()
方法,该方法只返回一个
text/html
,其中包含一个字符串,如
“服务正常”
。问题在于,构造函数中存在涉及远程处理和身份验证的逻辑,在活动检查的特定情况下,这会把事情搞砸。所以我在寻找一个优雅的解决方案。我想到的是,只有当请求URI为
../isAlive
时,才调用不同的构造函数,那么使用ContainerRequestFilter呢?也许您可以在
过滤器(ContainerRequestContext requestContext)
中检查请求的URI,并调用
ContainerRequestContext#abortWith(Response)
方法以避免调用命中资源。您可能需要对此ContainerRequestFilter
@PreMatching
进行注释,以便在收到客户端请求但在匹配资源方法之前执行它。(我不确定何时实际调用了资源构造函数)我认为这种方式不可能。在这样的上下文中,我如何知道当前请求的路径?
@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();
    }

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

}