我有一个班级
@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"
,我可以配置第一个构造函数吗?
答案 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
注释来访问您的应用程序的其他服务,如果这可以帮助您。