简短的故事:我有一个名为@SessionScoped
的CDI javax.enterprise.context
bean(来自javax.faces
而非来自UserContextBean
的注释)。我想在创建HTTP会话时实际执行某些操作。
所以很自然地我假设@PostConstruct
可以做到这一点:在构造这个bean的实例时只调用一次。
但是,根据文档here,他们说PostConstruct方法被称为:
当托管bean注入组件时,CDI会调用 所有注射完成后和所有初始化器后的方法 被称为。
我假设每个会话都会调用一次post构造方法。但是,实践与文档一致。这个bean被注入一个@RequestScoped
bean(也是CDI),它作为JSF页面的支持bean,PostConstruct方法被称为,用于每个请求。
我意识到(现在)这就是行为。但是,每个会话初始化会有任何其他方式做一次吗?
有些代码,虽然不是很相关:
@Named(UserContextBean.BEAN_NAME)
@SessionScoped
public class UserContextBean implements Serializable {
...
@PostConstruct
private void createSession() {
System.out.println("UserContext created.");
}
}
我注入此请求范围的bean:
public abstract class WebPageDataProvider extends AbstractViewDataProvider {
@Inject
private UserContextBean userContext;
我还想使用HttpSessionListener
并初始化会话bean,但它听起来已经很乱了。
修改
现在注意到甚至没有创建HTTP会话。如果我“手动”创建会话,通过调用getSession(true)
(我在一个阶段监听器中执行此操作,出于测试目的,但仅因为它已经存在),那么一切都按预期工作。
答案 0 :(得分:0)
HttpSessionListener是您最好的选择。你可以做的是将一个SessionScoped组件注入监听器并在那里设置值。