2010-12-19 57 views
8

我想知道是否可以观察具有多个JSF 2.0会话范围的支持bean的CDI事件。我认为我可以通过观察事件将事件/数据推送到多个会话。在会话范围内的JSF支持bean中观察到CDI事件

我已经设置了一个小测试,允许用户使用页面上的按钮触发事件(这与绑定到实际触发事件的会话作用域支持bean中的方法相关联)。我认为,如果我打开两个不同的浏览器,则会创建两个会话,并且该事件会通知每个会话作用域支持bean。

但是,当运行我的小测试并单击按钮在其中一个浏览器上触发事件时,我看到该事件仅通知会话作用域bean中的一个。它只通知事件被触发的bean(即 - 如果我单击浏览器1中的按钮,会通知在浏览器1中支持会话的会话作用域bean,如果我单击浏览器2中的按钮,浏览器2被通知)。

我的印象是事件会通知所有的bean实例。但是,这似乎并非如此。我应该能够做到这一点吗?我只是有东西安装错了吗?

UPDATE显示我的代码如下所示:

jsfpage.xhtml的片段来触发一个事件,并显示会话范围的数据:

 <h:form> 
      <h:outputText value="#{BackingBean.property}" /> 
      <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> 
     </h:form> 

会话 - 接受事件的豆子:

 
@Named 
@SessionScoped 
public class BackingBean implements Serializable { 

    private String property; 

    public String getProperty() { 
     return property 
    } 

    public void listenForChange(@Observes EventObj event) { 
     logger.log(Level.INFO, "Event received"); 
     property = event.toString(); 
    } 
} 

一种应用范围的bean触发事件:

 
@Named 
@ApplicationScoped 
public class EventFirer implements Serializable { 

    @Inject 
    private Event events; 

    public String fireEvent() { 
     logger.log(Level.INFO, "Event fired"); 
     events.fire(new EventObj()); 
     return null; 
    } 
} 
+0

你应该添加你的代码,船长。 – 2010-12-19 07:27:59

+0

你有没有找到解决方案?我正在尝试做同样的事情,并希望将数据推送到所有'@ SessionScoped' bean。 – Reitffunk 2014-08-27 02:07:57

回答

1

首先,你最好指定事件的类型:

@Inject 
private Event<EventObj> events; 

除此之外,还有在规范没有迹象表明会限制在其上调用observer方法的bean实例。我会提出一个关于这个问题的问题(在你正在使用的错误追踪器中,也许Weld?)

+0

我无法获取javax.enterprise.context.SessionScoped bean以观察由javax.enterprise.context.ApplicationScoped bean触发的事件。 引发异常:WELD-001303作用域类型javax.enterprise.context.ConversationScoped没有活动上下文。 – Steven 2013-10-15 12:38:39

0

我发现所有注册的观察者都被解雇了。

最值得注意的是,如果我在Conversation Scoped bean中有一个观察者,并且该Bean在当前对话中不活动,那么当触发该事件时,会特别创建一个新实例以接收它!