неожиданное переключение вкладки в по запросу AJAX после сбоя проверки

#primefaces #jsf-2 #mojarra

#первичные области #jsf-2 #mojarra

Вопрос:

Я использую простые интерфейсы <p:tabMenu> вместе с входными компонентами с проверкой. Всякий раз, когда происходит сбой проверки для таких входных компонентов, переключение табуляции невозможно (что является предполагаемым поведением). Однако, когда я изменяю входные данные, которые вызвали сбой проверки, последующий AJAX-запрос приводит к изменению активной вкладки.

Мне удалось воспроизвести поведение в очень простом примере:

 <f:metadata>
  <f:viewParam name="tab" value="#{bean.activeTab}" />
</f:metadata>

<h:form id="theForm">
  <p:tabMenu id="menu" activeIndex="#{bean.activeTab}">
    <p:menuitem id="tab0" update="menu content" value="Tab 0">
      <f:param name="tab" value="0"/>
    </p:menuitem>
    <p:menuitem id="tab1" update="menu content" value="Tab 1">
      <f:param name="tab" value="1"/>
    </p:menuitem>
  </p:tabMenu>

  <h:panelGroup id="content">
    <p>Active Tab: #{bean.activeTab}<br/></p>

    <h:inputText id="someInput" value="#{bean.someInput}" required="true">
      <p:ajax update="menu content"/>
    </h:inputText>
    <p:message id="m_someInput" for="someInput"/>
  </h:panelGroup>
</h:form>
  

Вспомогательный компонент для представления является @ViewScoped и содержит только методы получения и настройки для следующих свойств:

 private String someInput = null;
private Integer activeTab = 0;
  

Запустите пример, попробуйте переключиться на «Вкладку 1», которая завершается неудачей из-за пустого someInput поля и показывает сбой проверки. Введите некоторый текст в поле ввода и щелкните за пределами ввода, чтобы вызвать событие изменения и запрос AJAX. Теперь вторая вкладка («Вкладка 1») становится активной! Почему? Это ошибка в PrimeFaces или я делаю что-то не так?

Моя среда:

  • Простые интерфейсы 7.0 / 8.0
  • JSF 2.2.15 / 2.3.17 (Mojarra)
  • Wildfly 10.1.0.Final/26.0.1.Final

Обновить

  • Я создал проблему на github # 4471 с проектом reproducer, который сейчас закрыт.
  • Проблема существует только с Mojarra, даже с 2.3.17. MyFaces, похоже, работает так, как ожидалось.
  • Реальная причина, вероятно, в проблеме # 4562 Mojarra.

Обходной путь

Обходной путь, который может быть или не быть подходящим, в зависимости от ваших реальных потребностей, заключается в том, чтобы превратить AJAX-запрос с переключением табуляции в POST-запрос, отличный от AJAX, путем добавления ajax="false" к <p:menuItem> тегам.

Комментарии:

1. Добавляет ли resetValues="true" в p:ajax справку?

2. Нет, добавление resetValues="true" здесь не имеет никакого эффекта.