CDI RequestScope根据请求提供多个对象

时间:2014-09-03 15:04:50

标签: java cdi

我有一个应用程序,我们有一个bean作为

@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时,我无法弄清楚为什么不注入相同的对象。有什么我想念的吗?

2 个答案:

答案 0 :(得分:0)

同一个对象是什么意思? 如果您调用getter-methods,过滤器中设置的内容是否仍然存在于 TokenService 中?

SessionFilter TokenService 中注入的Bean是隐藏每个请求的实际实例的cdi-proxy-objects。 有关详细信息,请参阅this question

答案 1 :(得分:0)

我有完全相同的问题。我正在使用Java EE 7和wildfly 8.1。

我目前的解决方案是使用

HttpServletRequest context = (HttpServletRequest) PolicyContext.getContext("javax.servlet.http.HttpServletRequest");

这可以在 UserSession 中使用,通过Http-Header填充会话

@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;
    }

}