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

时间:2011-05-26 14:58:11

标签: java rest jersey

我正在寻找一个好的REST tutorial using Jersey。 在页面下方,构建了一个名为TodoResource的Web资源,其本身包含两个实例变量

public class TodoResource {
    @Context
    UriInfo uriInfo;

    @Context
    Request request;

    String id;

    public TodoResource(UriInfo uriInfo, Request request, String id) {
        this.uriInfo = uriInfo;
        this.request = request;
        this.id = id;
    }
}

我想知道UriInfoRequest实例变量是如何初始化的?我知道使用@Context注释可以注入信息,但这会发生在什么时候?这会由泽西自动处理吗?

3 个答案:

答案 0 :(得分:27)

我使用Rules of Injection遇到了一些有趣的结果,这是我发现的:

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
  }
}

我希望这会有所帮助。

答案 1 :(得分:23)

泽西岛不会修改类,但会在客户的每个请求中创建

调用类构造函数后,将注入上下文字段 (如果您尝试访问构造函数中的那些字段,它们将是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, ...注释的内部方法(代表网络资源)中,您可以访问上下文字段。

答案 2 :(得分:17)

使用 @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
    }
}