Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf CDI会话范围bean的非惰性实例化_Jsf_Jsf 2_Cdi - Fatal编程技术网

Jsf CDI会话范围bean的非惰性实例化

Jsf CDI会话范围bean的非惰性实例化,jsf,jsf-2,cdi,Jsf,Jsf 2,Cdi,CDI新手问题。简单测试场景:JSF+CDI会话范围bean 我需要一种优雅的方式来实例化一组已知的会话范围的cdibean,而不必在JSF页面上提及它们,也不必从其他bean调用它们的方法。作为一个测试用例——一个简单的日志bean,它只记录http会话的开始和结束时间 当然,我可以创建一个空的JSF组件,将其放在站点范围的模板中,并使其触发所需会话bean的虚拟方法,但从我的观点来看,这有点难看 我看到的另一个选项是选择一个会话bean(在JSF中通过EL或通过其他bean的引用100%初始

CDI新手问题。简单测试场景:JSF+CDI会话范围bean

我需要一种优雅的方式来实例化一组已知的会话范围的cdibean,而不必在
JSF
页面上提及它们,也不必从其他bean调用它们的方法。作为一个测试用例——一个简单的日志bean,它只记录http会话的开始和结束时间

当然,我可以创建一个空的JSF组件,将其放在站点范围的模板中,并使其触发所需会话bean的虚拟方法,但从我的观点来看,这有点难看

我看到的另一个选项是选择一个会话bean(在
JSF
中通过
EL
或通过其他bean的引用100%初始化),并使用其
@PostConstruct
方法触发其他会话bean-该解决方案比前一个稍微简单一些


看来我这里遗漏了什么,如果有其他想法,我将不胜感激。

是的,
HttpSessionListener
可以。只需注入bean并调用它们

如果您的容器不支持HttpSessionListener中的注入,您可以查看deltaspike core和
BeanProvider


在接受Karl的回答并感谢Luiggi的提示的同时,我也发布了我的解决方案,该解决方案基于
HttpSessionListener
,但不需要与
BeanProvider
BeanManager
任何东西打交道

@WebListener
public class SessionListener implements HttpSessionListener {

  @Inject
  Event<SessionStartEvent> startEvent;
  @Inject
  Event<SessionEndEvent> endEvent;

  @Override
  public void sessionCreated(HttpSessionEvent se) {
    SessionStartEvent e = new SessionStartEvent();
    startEvent.fire(e);
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    SessionEndEvent e = new SessionEndEvent();
    endEvent.fire(e);
  }
}

对于您的测试用例,我将使用。你能提供一个真正的用例来做这件事吗?@LuiggiMendoza,谢谢,尽管我过去在JSFbean中使用SessionBindingListener,但我忘记了会话侦听器。至于实际情况,我说这是一个新手问题,我尝试将许多会话类与交叉引用解耦,发现其中一些会话类需要在会话启动和销毁时执行一些活动—主要是日志记录和安全性方面。实际上,最好的解决方案是,您应该将此标记为正确答案。
@Named
@SessionScoped
public class SessionLogger implements Serializable {

  @PostConstruct
  public void init() {
    // is called first
  }

  public void start(@Observes SessionStartEvent event) {
    // is called second
  }
}