泽西岛 - 用于注射的@Context注释。它是如何工作的?

2022-09-01 05:10:12

我正在看一个使用泽西岛的好的REST教程。在页面下方,有一个构建的Web资源,其标题本身包含两个实例变量TodoResource

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


答案 1

我在注射规则方面遇到了一些有趣的结果,这是我发现的:

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

我希望这有帮助。


答案 2

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
}

但是在用您注释的方法(表示Web资源)中,可以访问上下文字段。@POST, @GET, ...