我正在寻找一个好的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;
}
}
我想知道UriInfo
和Request
实例变量是如何初始化的?我知道使用@Context
注释可以注入信息,但这会发生在什么时候?这会由泽西自动处理吗?
答案 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
}
}