在RequestScoped bean CDI上的HttpServletRequest注入 [英] HttpServletRequest injection on RequestScoped bean CDI
问题描述
我正在寻找一种将@RequestScoped
定制类注入到我的@Stateless
JAX-RS端点中的方法:
I'm looking for a way in order to inject a @RequestScoped
custom class into my @Stateless
JAX-RS endpoint:
我希望每次应用程序收到请求时,都会将我的自定义类注入到我的JAX-RS端点中.
I want each time the application receives a request my custom class is injected in my JAX-RS endpoint.
自定义类:
@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
类声明为@RequestScoped
,以便在每次接收到请求时进行初始化.
为此,我需要访问HttpServletResquest
以获得标题参数.
So, I declare my CurrentTransaction
class as @RequestScoped
in order to be initialized each time a request is received.
In order to do this, I need to access to HttpServletResquest
in order to get header parameters.
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
类的构造函数.但是,HttpServletRequest
请求字段未初始化(注入).
CDI arrive to perform the constructor of CurrentTransaction
class. However, HttpServletRequest
request field is not initialized (injected).
我在做什么错了?
推荐答案
A late answer on this one--maybe useful to other readers: dependency injection in CDI is done in the following order:
- 构造函数被调用
- 注入了田地 调用
-
@PostConstruct
注释的方法
最后一点是您要介入以进行进一步的初始化,需要对注入的字段进行访问:
The last point is where you want to step in for further initialization that needs access on the injected fields:
@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 bean CDI上的HttpServletRequest注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!