ActionListener вызывается несколько раз (ошибка?) - Mojarra 2.1.3 - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть следующая кнопка:

   <h:commandButton 
     disabled="#{mybean.searching}"
     binding="#{mybean.searchButton}"
     actionListener="#{mybean.searchForLicenses}"
     value="Search" />

Когда я отлаживаю, я вижу, что actionListener вызывается сначала дважды, затем три раза, затем четыре раза, а затем следующий.

Кажется, что при каждой перезагрузке actionListener регистрируется еще раз.

Я использую Mojarra 2.1.3 (также пробовал 2.0.6) и Tomcat 7 с IceFaces.

Привязка выполняется следующим образом:

private javax.faces.component.UICommand searchButton;

public void setSearchButton(UICommand searchButton) {
  this.searchButton = searchButton;
}

public UICommand getSearchButton() {
  return searchButton;
}

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Это может произойти, если вы привязали компонент к сессионному компоненту или компоненту с областью приложения вместо компонента с запросом.Это просто плохой дизайн.Один и тот же компонент будет повторно использоваться в нескольких запросах / представлениях.Вам необходимо поместить компонент в область запроса или вообще избавиться от привязки компонента.

Обратите внимание, что привязка компонента непосредственно к бину часто является признаком плохого дизайна где-то в коде.Что это, функциональное требование и / или проблема, для которой вы думали, что это решение?Если вы укажете это подробнее, мы сможем предложить правильный подход.

Также обратите внимание, что использование только слушателя действия также является запахом дизайна.Я ожидаю, что searchForLicenses будет нормальным методом действия.Смотрите также Различия между action и actionListener .

0 голосов
/ 06 октября 2014

Подобная проблема возникает, когда компонент использует binding и validator или valueChangListener, а базовый компонент имеет область действия View, Session или Application. Затем соответствующие слушатели вызывают много раз, но не один раз во время запроса (+1 раз с каждым новым запросом).

Одним из возможных решений является переопределение класса jsf AttachedObjectListHolder, который используется для хранения компонента listeners. Текущая реализация просто добавляет новый listener к компоненту, хотя тот же listener уже существует. Поэтому предлагаем исправить это, чтобы проверить, что listener не существует, прежде чем добавить его.

Подробности исправления вы можете увидеть здесь

...