我正在使用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)
我想知道如何初始化UriInfo和Request实例变量?我知道使用@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)
| 归档时间: |
|
| 查看次数: |
67019 次 |
| 最近记录: |