Java Jersey-用于注入的@Context注释。它是如何工作的?

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实例变量是如何初始化的?我知道使用

我在看一本好的。 在页面下方,有一个构建的web资源名为
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类正在修改它。我要试一试。谢谢你的帮助