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

Joe*_*dev 37 java rest jersey

我正在使用Jersey查看一个很好的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ers 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
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


jav*_*eed 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
}
Run Code Online (Sandbox Code Playgroud)

但是用@POST, @GET, ...你注释的内部方法(代表web资源)可以访问上下文字段.


Kin*_*iro 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
    }
}
Run Code Online (Sandbox Code Playgroud)