如何从@ApplicationScoped bean调用@SessionScoped bean中的方法

时间:2014-10-28 13:22:15

标签: java cdi java-ee-6

有没有办法可以获得对@SessionScoped bean的引用,并从@ApplicationScoped bean调用一个方法?

BeanManager.getContext()在请求期间正常工作,但它看起来不在请求之外。我在GlobalHttpSessionController中保留了一个活跃的HttpSessions列表,但这似乎没有任何帮助。感谢您的评论。

@ApplicationScoped
public class MyAppScopedClass {

    @Inject
    GlobalHttpSessionController globalHttpSessionController;

    @Inject
    BeanManager beanManager;

    public void updateSessions() {
        // List of active user sessions
        List<HttpSession> session = globalHttpSessionController.getSessions();
        Set<Bean<?>> set = beanManager.getBeans(UserSessionBean.class);

        for (Bean bean : set) {
            ((UserSessionBean) beanManager.getContext(bean.getScope()).get(bean, beanManager.createCreationalContext(bean))).method();
        }
    }

}

2 个答案:

答案 0 :(得分:0)

您可以尝试模仿Spring MVC。当您在单例作用域中注入SessionScoped bean时,它会在执行时注入一个代理,该代理在当前会话中使用该bean。因为没有它,在创建应用程序作用域bean时会得到一个bean,并且只访问那个bean。

编辑:

看起来从其上下文中提取会话bean并不是很容易(即当它的会话不活动时)。因此,您应该将对bean的引用存储为会话属性,以便以后能够轻松检索它。

但我认为你想要的是事件管理。不幸的是,我从未在Java EE CDI环境中使用它。

答案 1 :(得分:0)

您可以使用Instance&lt;&gt;访问较低范围的bean。您的应用程序作用域bean将包含Session作用域bean的供应商,并且仅在需要时才访问它。然后,您将在那一刻获得会话的bean实例。

@Inject
private Instance<MySessionScopedBean> beanInstance;

public void doStuff() {
   beanInstance.get().useMethodOfSessionScopedBean();
}