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