Java Jersey-用于注入的@Context注释。它是如何工作的?
我在看一本好的。 在页面下方,有一个构建的web资源名为Java Jersey-用于注入的@Context注释。它是如何工作的?,java,rest,jersey,Java,Rest,Jersey,我在看一本好的。 在页面下方,有一个构建的web资源名为TodoResource,它本身包含两个实例变量 公共类TodoResource{ @上下文 UriInfo-UriInfo; @上下文 请求; 字符串id; public-TodoResource(UriInfo-UriInfo、请求-请求、字符串id){ this.uriInfo=uriInfo; this.request=请求; this.id=id; } } 我想知道UriInfo和Request实例变量是如何初始化的?我知道使用
TodoResource
,它本身包含两个实例变量
公共类TodoResource{
@上下文
UriInfo-UriInfo;
@上下文
请求;
字符串id;
public-TodoResource(UriInfo-UriInfo、请求-请求、字符串id){
this.uriInfo=uriInfo;
this.request=请求;
this.id=id;
}
}
我想知道
UriInfo
和Request
实例变量是如何初始化的?我知道使用@Context
注释允许注入信息,但在什么时候会发生这种情况?Jersey是否会自动处理此问题?Jersey不会修改类,但会根据客户端的每个请求创建类
调用类构造函数后,将注入上下文字段。(如果您尝试访问构造函数中的这些字段,它们将为
null
)
在您的情况下,该类不需要特定的构造函数,因此只需:
public TodoResource () {
// in most cases the ctor stays empty.
// don't do much work here, remember: the ctor is invoked at every client request
}
但在用
@POST、@GET、
注释的方法(表示web资源)中,您可以访问上下文字段。我遇到了一些有趣的结果,我发现:
public class TodoResource{
@Context
UriInfo uriInfo; // Set second
public TodoResource(@Context UriInfo value){
uriInfo = value; // Set first (makes sense)
}
@Context
public void setUriInfo(UriInfo value){
uriInfo = value; // Set third
}
}
我希望这有帮助。使用@PostConstruct方法注释:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Path("foo")
public class AuthResource {
@Context
HttpServletRequest request;
public AuthResource() {
//request is null
}
@PostConstruct
public void postConstruct() {
//request is NOT null
}
@PreDestroy
public void preDestroy() {
//after rest method executing
}
}
我不知道细节,但是Jersey会在幕后自动初始化这些变量。如果您需要了解它如何工作的细节,在Eclipse中,您可以在其中一个变量上放置一个“观察点”,它告诉调试器在修改该变量时中断。然后您可以查看堆栈跟踪,并查看Jersey类正在修改它。我要试一试。谢谢你的帮助