我想知道是否有可能观察到多个JSF 2.0会话作用域支持bean的CDI事件.我以为我可以通过观察事件将事件/数据推送到多个会话.
我已经设置了一个小测试,允许用户使用页面上的按钮触发事件(它与会话范围的支持bean中实际触发事件的方法相关联).我认为,如果我打开两个不同的浏览器,将创建两个会话,并且事件将通知每个会话范围的支持bean.
但是,当运行我的小测试并单击按钮以在其中一个浏览器上触发事件时,我看到该事件仅通知其中一个会话范围的bean.它只通知触发事件的bean(即 - 如果我单击浏览器1中的按钮,则会通知浏览器1中支持会话的会话范围bean,如果我单击浏览器2中的按钮,则支持会话的bean浏览器2被通知).
我的印象是事件会通知所有bean实例.但是,情况似乎并非如此.我能做到吗?我只是设置错误吗?
更新以显示我的代码:
用于触发事件并显示会话范围数据的jsfpage.xhtml片段:
Run Code Online (Sandbox Code Playgroud)<h:form> <h:outputText value="#{BackingBean.property}" /> <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> </h:form>
接收事件的Session-scoped 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();
}
}
Run Code Online (Sandbox Code Playgroud)
用于触发事件的应用程序作用域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;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,您最好指定事件的类型:
@Inject
private Event<EventObj> events;
Run Code Online (Sandbox Code Playgroud)
除此之外,规范中没有任何指示会限制调用观察者方法的 bean 实例。我会就此提出一个问题(在您正在使用的实现的错误跟踪器中。也许是 Weld?)
| 归档时间: |
|
| 查看次数: |
2609 次 |
| 最近记录: |