短篇小说:我@SessionScoped
有javax.enterprise.context
一个javax.faces
名为UserContextBean
. 我想在创建 HTTP 会话时实际做一些事情。
所以很自然地,我认为@PostConstruct
这样做可以解决问题:在构造这个 bean 的实例时只调用一次。但是,根据此处的文档,他们说调用了 PostConstruct 方法:
当托管 bean 被注入到组件中时,CDI 会在所有注入发生且所有初始化程序都被调用后调用该方法。
我曾假设每个会话都会调用一次 post 构造方法。但是,实践与文档一致。这个 bean 被注入到一个@RequestScoped
bean(也叫 CDI)中,该 bean 用作 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)
(出于测试目的,我在阶段侦听器中执行此操作,但只是因为它已经存在),那么一切都会按预期工作。