在会话范围内的JSF支持bean中观察到CDI事件

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

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

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

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

更新显示我的代码是什么样的:

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

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

接收事件的会话范围的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 events;

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

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

@Inject
private Event<EventObj> events;

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


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

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

链接地址: http://www.djcxy.com/p/62205.html

上一篇: Do CDI Events observed across session scoped JSF backing beans

下一篇: ASLR Entropy Bits for Stack on Linux