RequestScoped bean CDI 上的 HttpServletRequest 注入
HttpServletRequest injection on RequestScoped bean CDI
我正在寻找一种方法,以便将 @RequestScoped
自定义 class 注入我的 @Stateless
JAX-RS 端点:
我希望每次应用程序收到请求时,我的自定义 class 都会注入我的 JAX-RS 端点。
自定义class:
@RequestScoped
public class CurrentTransaction {
private String user;
private String token;
@PersistenceContext(name="mysql")
protected EntityManager em;
@Inject HttpServletRequest request;
public CurrentTransaction() {
this.user = request.getHeader("user");
this.token = request.getHeader("token");
}
//getters and setters ...
}
因此,我将 CurrentTransaction
class 声明为 @RequestScoped
,以便在每次收到请求时进行初始化。
为此,我需要访问 HttpServletResquest
以获得 header 参数。
JAX-RS 端点:
@Stateless
@Path("/areas")
public class AreasEndpoint {
@PersistenceContext(unitName = "mysql")
protected EntityManager em;
@Inject
protected CurrentTransaction current_user_service;
@POST
@Path("postman")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Authentication
public Response create(AreaRequest request) {
if (this.current_user_service.getUser() == null) {
System.out.println("Go!!!");
return Response.status(Status.FORBIDDEN).build();
} else {
System.out.println("---- user: " + this.current_user_service.getUser());
System.out.println("---- token: " + this.current_user_service.getToken());
}
}
// ...
}
CDI 到达执行 CurrentTransaction
class 的构造函数。但是,HttpServletRequest
请求字段未初始化(注入)。
我做错了什么?
关于这个问题的迟到答案——可能对其他读者有用:CDI 中的依赖注入按以下顺序完成:
- 构造函数被调用
- 字段被注入
@PostConstruct
注释方法被调用
最后一点是您要介入的地方,以进行需要访问注入字段的进一步初始化:
@Inject HttpServletRequest request;
public CurrentTransaction() {
// field injection has not yet taken place here
}
@PostConstruct
public void init() {
// the injected request is now available
this.user = request.getHeader("user");
this.token = request.getHeader("token");
}
我正在寻找一种方法,以便将 @RequestScoped
自定义 class 注入我的 @Stateless
JAX-RS 端点:
我希望每次应用程序收到请求时,我的自定义 class 都会注入我的 JAX-RS 端点。
自定义class:
@RequestScoped
public class CurrentTransaction {
private String user;
private String token;
@PersistenceContext(name="mysql")
protected EntityManager em;
@Inject HttpServletRequest request;
public CurrentTransaction() {
this.user = request.getHeader("user");
this.token = request.getHeader("token");
}
//getters and setters ...
}
因此,我将 CurrentTransaction
class 声明为 @RequestScoped
,以便在每次收到请求时进行初始化。
为此,我需要访问 HttpServletResquest
以获得 header 参数。
JAX-RS 端点:
@Stateless
@Path("/areas")
public class AreasEndpoint {
@PersistenceContext(unitName = "mysql")
protected EntityManager em;
@Inject
protected CurrentTransaction current_user_service;
@POST
@Path("postman")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Authentication
public Response create(AreaRequest request) {
if (this.current_user_service.getUser() == null) {
System.out.println("Go!!!");
return Response.status(Status.FORBIDDEN).build();
} else {
System.out.println("---- user: " + this.current_user_service.getUser());
System.out.println("---- token: " + this.current_user_service.getToken());
}
}
// ...
}
CDI 到达执行 CurrentTransaction
class 的构造函数。但是,HttpServletRequest
请求字段未初始化(注入)。
我做错了什么?
关于这个问题的迟到答案——可能对其他读者有用:CDI 中的依赖注入按以下顺序完成:
- 构造函数被调用
- 字段被注入
@PostConstruct
注释方法被调用
最后一点是您要介入的地方,以进行需要访问注入字段的进一步初始化:
@Inject HttpServletRequest request;
public CurrentTransaction() {
// field injection has not yet taken place here
}
@PostConstruct
public void init() {
// the injected request is now available
this.user = request.getHeader("user");
this.token = request.getHeader("token");
}