Имеются ли события CDI, наблюдаемые в компонентах поддержки JSF в рамках сеанса - PullRequest
10 голосов
/ 19 декабря 2010

Мне интересно, возможно ли наблюдать событие CDI с несколькими компонентами поддержки JSF 2.0 в области сеанса. Я думал, что смогу перенести событие / данные на несколько сеансов, наблюдая за событием.

Я установил небольшой тест, который позволяет пользователю запускать событие с помощью кнопки на странице (которая связана с методом в компоненте поддержки области действия, который фактически запускает событие). Я думал, что если я открою два разных браузера, будет создано два сеанса, и событие будет уведомлять каждый из bean-компонентов сферой действия.

Однако, когда я запускаю мой маленький тест и нажимаю кнопку, чтобы запустить событие в одном из браузеров, я вижу, что это событие уведомляет только один из bean-компонентов области действия. Он только уведомляет бин, из которого было сгенерировано событие (т. Е. - если я нажимаю кнопку в браузере 1, бин с областью действия, поддерживающий сеанс в браузере 1, получает уведомление, а если я нажимаю кнопку в браузере 2, бин, поддерживающий сеанс в браузер 2 уведомлен).

У меня сложилось впечатление, что события будут уведомлять все экземпляры бобов. Тем не менее, это не так. Должен ли я быть в состоянии сделать это? У меня просто что-то не так с настройкой?

ОБНОВЛЕНИЕ , чтобы показать, как выглядит мой код:

Фрагмент 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();
    }
}

Бин области действия приложения для запуска события:

@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;
    }
}

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Сначала вам лучше указать тип события:

@Inject
private Event<EventObj> events;

Кроме того, в спецификации нет указания, которое ограничивало бы экземпляры bean-компонентов, для которых вызывается метод наблюдателя. Я бы подал вопрос об этом (в багтрекере используемой вами реализации. Возможно, Weld?)

0 голосов
/ 19 октября 2011

Я обнаружил, что все зарегистрированные наблюдатели уволены.

В частности, если у меня есть наблюдатель на bean-объекте Conversation Scoped, и этот bean-компонент не активен в текущем Conversation, тогда, когда событие вызывается, специально создается новый экземпляр для его получения!

...