CDI SessionScoped托管bean中的PostConstruct

时间:2013-05-10 11:06:36

标签: java-ee glassfish-3 cdi managed-bean weld

简短的故事:我有一个名为@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)(我在一个阶段监听器中执行此操作,出于测试目的,但仅因为它已经存在),那么一切都按预期工作。

1 个答案:

答案 0 :(得分:0)

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

相关问题