有没有办法可以获得对@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();
}
}
}
答案 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();
}