当前位置: 首页 > 知识库问答 >
问题:

CDI会话处理的托管bean中的后构造

商品
2023-03-14

短篇故事:我有一个CDI@SessionScopedbean(注释来自javax.enterprise.context而不是来自javax.faces),称为UserContextBean。我想在创建HTTP会话时实际做一些事情。

因此,我很自然地假设@PostConstruct会起作用:当构造这个bean的实例时,只调用一次。但是,根据这里的文档,他们说调用PostConstruct方法:

当托管bean被注入到组件中时,CDI会在所有注入发生后以及在调用所有初始值设定项后调用该方法。

我假设构造后方法将在每个会话中调用一次。然而,实践与文件一致。这个bean被注入到@RequestScopedbean(也叫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个答案

万开畅
2023-03-14

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

 类似资料:
  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 我有一个会话范围的CDI托管bean: 在某个流之后,我需要从会话中删除这个bean,对于该流,我使用了以下代码,如下面的答案所示: 但是,它不起作用,仍然留在会话中。 我是否遗漏了什么?

  • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

  • 问题内容: 假设我有一个实体类,汽车。 我的IDE使我可以从实体类自动生成会话bean,因此最终得到了CarFacade 我也可以生成JSF托管bean 我可以理解Entity类和其他Bean之间的有意义的区别,但是无状态会话Bean和托管Bean之间有什么区别?我读到无状态会话Bean用于实现在实体上运行的业务逻辑,而托管Bean用于通过在托管Bean上使用网页调用方法并进行托管Bean调用来与

  • MyCart.java 这个MyCart Bean是每个HTTP会话实例化的名为CDI的Bean。 抽象类 问题描述 仅用于理解会话范围的CDI。我有两个JSP文件,如下所示 SetCDIBeanValue.jsp其中,我将获得命名会话CDI Bean(MyCart)的实例将It String属性的值设置为String值FROM_FIRST_JSP 因为这个会话的作用域是有限的,所以我想应该只有一

  • 我们希望通过集成SpringCDIJSFSpringSecurity来创建web应用程序。我们已经配置了上面所有的框架,我们认为一切正常,但是在实现注销功能的过程中,我们意识到JSF的ManagedBeans并不是在应该创建的时候创建的。例如:我们已经在会话作用域中创建了托管bean,我们希望在注销并使会话无效后删除该bean。 不幸的是,在重新登录之后,托管bean实例仍然是活的(每个用户的信息