我想知道是否可以使用多个 JSF 2.0 会话范围的支持 bean 观察 CDI 事件。我认为我可以通过观察事件将事件/数据推送到多个会话。
我设置了一个小测试,允许用户使用页面上的按钮触发事件(该按钮与实际触发事件的会话范围支持 bean 中的方法相关联)。我认为如果我打开两个不同的浏览器,将创建两个会话,并且该事件将通知每个会话范围的支持 bean。
但是,当运行我的小测试并单击按钮以在其中一个浏览器上触发事件时,我看到该事件仅通知会话范围 bean 之一。它只通知触发事件的 bean(即 - 如果我单击浏览器 1 中的按钮,则通知支持浏览器 1 中的会话的会话范围 bean,如果我单击浏览器 2 中的按钮,则支持会话的 bean浏览器 2 被通知)。
我的印象是事件会通知所有 bean 实例。然而,情况似乎并非如此。我应该能够做到这一点吗?我只是有什么设置错误吗?
更新以显示我的代码的样子:
jsfpage.xhtml 的片段,用于触发事件并显示会话范围的数据:
<h:form>
<h:outputText value="#{BackingBean.property}" />
<p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" />
</h:form>
接收事件的 Session 范围的 bean:
@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<EventObj> events;
public String fireEvent() {
logger.log(Level.INFO, "Event fired");
events.fire(new EventObj());
return null;
}
}