繁体   English   中英

CDI SessionScoped托管bean中的PostConstruct

[英]PostConstruct in CDI SessionScoped managed beans

简短的故事:我有一个名为UserContextBean的CDI @SessionScoped bean(来自javax.enterprise.context而不是来自javax.faces注释)。 我想在创建HTTP会话时实际执行某些操作。

所以我很自然地认为@PostConstruct可以解决这个问题:在构造这个bean的实例时只调用一次。 但是,根据此处的文档,他们说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.");
    }
}

请求scoped bean我在哪里注入:

public abstract class WebPageDataProvider extends AbstractViewDataProvider {

    @Inject
    private UserContextBean userContext;

我还想使用HttpSessionListener并初始化会话bean,但它已经听起来很乱。

编辑

刚刚注意到甚至没有创建HTTP会话。 如果我“手动”创建会话,通过调用getSession(true) (我在一个阶段监听器中执行此操作,出于测试目的,但仅因为它已经存在),那么一切都按预期工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM