11

複数のJSF2.0セッションスコープのバッキングBeanでCDIイベントを監視できるかどうか疑問に思っています。イベントを観察することで、イベント/データを複数のセッションにプッシュできると思いました。

ユーザーがページ上のボタンを使用してイベントを発生させることができる小さなテストを設定しました(これは、実際にイベントを発生させるセッションスコープのバッキングBeanのメソッドに関連付けられています)。2つの異なるブラウザーを開くと、2つのセッションが作成され、イベントが各セッションスコープのバッキングBeanに通知すると思いました。

ただし、小さなテストを実行し、ボタンをクリックしていずれかのブラウザーでイベントを発生させると、イベントがセッションスコープのBeanの1つにのみ通知することがわかります。イベントが発生した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>

イベントを受信するセッションスコープの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;
    }
}
4

2 に答える 2

2

まず、イベントのタイプを指定することをお勧めします。

@Inject
private Event<EventObj> events;

それを除けば、オブザーバーメソッドが呼び出されるBeanインスタンスを制限する仕様には示されていません。私はこれについて問題を提起します(あなたが使用している実装のバグトラッカーで。おそらくWeld?)

于 2010-12-27T16:13:01.330 に答える
0

登録されているすべてのオブザーバーが解雇されていることがわかりました。

特に、会話スコープのBeanにオブザーバーがいて、そのBeanが現在の会話でアクティブでない場合、イベントが発生すると、それを受け取るために特別に新しいインスタンスが作成されます。

于 2011-10-19T08:14:38.133 に答える