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

37

我正在查看一份不错的使用Jersey的REST教程。 在页面下方,有一个名为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注释可以注入信息,但是注入是在什么时候进行的?这是否由Jersey自动处理?


3
我不知道具体细节,但是是的,在幕后,Jersey会自动初始化那些变量。如果你需要了解其工作原理的详细信息,在Eclipse中,你可以在其中一个变量上放置“监视点”,这将告诉调试器每次修改该变量时都停止执行。然后你就可以查看堆栈跟踪并查看哪个Jersey类正在修改它。 - Tyler
3个回答

27

我在使用注入规则时遇到了一些有趣的结果,以下是我的发现:

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

希望这能有所帮助。


23

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资源),您将可以访问上下文字段。


16

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接