3

CDI新手问题。简单的测试场景:JSF + CDI SessionScoped beans。

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

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

我看到的另一个选项是选择单个会话 bean(通过ELinJSF或来自其他 bean 的引用初始化 100%),并使用它的@PostConstruct方法来触发其他会话 bean——该解决方案比前一个解决方案更丑。

看起来我在这里遗漏了一些东西,我会很感激任何其他想法。

4

2 回答 2

3

在接受卡尔的回答并感谢 Luiggi 的提示的同时,我还发布了我的解决方案,该解决方案基于HttpSessionListener但不需要弄乱BeanProviderBeanManager任何东西。

@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);
  }
}

令我惊讶的是,上面的代码实例化了所有方法正在观察这些事件的 bean:

@Named
@SessionScoped
public class SessionLogger implements Serializable {

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

  public void start(@Observes SessionStartEvent event) {
    // is called second
  }
}
于 2013-11-14T05:35:50.960 回答
1

是的,HttpSessionListener会这样做。只需注入 bean 并调用它们。

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

http://deltaspike.apache.org/core.html

于 2013-11-13T20:43:06.807 回答