Java CDI RequestScope在请求中提供多个对象
我有一个应用程序,其中有一个bean作为Java CDI RequestScope在请求中提供多个对象,java,cdi,Java,Cdi,我有一个应用程序,其中有一个bean作为 @RequestScoped public class UserSession extends SessionMessage { } 然后我们有一个WebFilter,上面的bean被注入其中。过滤器填充此userSession对象上的所有属性 public class SessionFilter implements Filter { @Inject private UserSession userSession; ....
@RequestScoped
public class UserSession extends SessionMessage {
}
然后我们有一个WebFilter
,上面的bean被注入其中。过滤器填充此userSession
对象上的所有属性
public class SessionFilter implements Filter {
@Inject
private UserSession userSession;
.....
public void doFilter(....){
.....
someService.populateSession(userSession);
chain.doFilter(req, res)
}
}
然后在
@Path("/token")
public class TokenService {
@Inject
private UserSession userSession;
.....
}
我希望SessionFilter
中注入的对象与TokenService
中注入的对象相同。但是,我在TokenService
中得到的对象与在SessionFilter
中注入的对象不同
当我将同一个对象定义为RequestScope时,我无法理解为什么不注入它。我遗漏了什么吗?你对同一个物体是什么意思?
如果调用getter方法,那么过滤器中设置的内容是否仍在TokenService中
SessionFilter和TokenService中注入的bean是cdi代理对象,隐藏每个请求的实际实例。
有关更多详细信息,请参见我遇到了完全相同的问题。我将JavaEE7与wildfly 8.1一起使用 我目前的解决方案是使用
HttpServletRequest context = (HttpServletRequest) PolicyContext.getContext("javax.servlet.http.HttpServletRequest");
这可以在UserSession中使用,通过Http头填充会话
@RequestScoped
public class UserSession extends SessionMessage {
public Session getSession() {
HttpServletRequest context = (HttpServletRequest) PolicyContext.getContext("javax.servlet.http.HttpServletRequest");
Session session = someService.populateSession(context);
return session;
}
}
在筛选器中设置的属性在TokenService中不可用。如果我将userSession对象记录在filter和token中,我会得到以下信息:2014年9月2日下午3:34:40 SessionFilter doFilter信息:userSession:UserSession@3fcfbc652014年9月2日下午3:34:40 TokenService createToken信息:用户会话:UserSession@5f59ab9d从这里,我意识到我得到了一个独立的物体,就像我说的:注入的bean是隐藏真实实例的代理(每个请求)。使用setter-and-getter方法访问属性,它应该按照预期工作。我知道这些是代理对象。我正在使用getter方法获取userSession的属性。但是,当我尝试在TokenService中访问它时,没有设置属性。我可以看到过滤器中设置的属性。你能说明你在使用什么实现吗?