3

短篇小说:我@SessionScopedjavax.enterprise.context一个javax.faces名为UserContextBean. 我想在创建 HTTP 会话时实际做一些事情。

所以很自然地,我认为@PostConstruct这样做可以解决问题:在构造这个 bean 的实例时只调用一次。但是,根据此处的文档,他们说调用了 PostConstruct 方法:

当托管 bean 被注入到组件中时,CDI 会在所有注入发生且所有初始化程序都被调用后调用该方法。

我曾假设每个会话都会调用一次 post 构造方法。但是,实践与文档一致。这个 bean 被注入到一个@RequestScopedbean(也叫 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)(出于测试目的,我在阶段侦听器中执行此操作,但只是因为它已经存在),那么一切都会按预期工作。

4

1 回答 1

0

HttpSessionListener 是您最好的选择。您可以做的是将 SessionScoped 组件注入侦听器并在那里设置值。

于 2013-05-10T15:42:14.443 回答