Атрибут Binding приводит к дублированию идентификатора компонента, найденного в представлении

Вот код JSF:

<h:inputText binding="#{bean.input}" />

А вот часть вспомогательного компонента для поддержки связывания:

private HtmlInputText input;

public void setInput(HtmlInputText input) {
    this.input = input;
}

public HtmlInputText getInput() {
    return this.input;
}

Когда я открываю страницу в первый раз, все работает нормально, но когда я открываю ее во второй раз (обновляю или открываю тот же URL в другой вкладке или любым другим способом), я получаю ошибку дублирующегося идентификатора. Сообщение об ошибке говорит, что <h:inputText> не имеет уникального идентификатора Вот часть длинного сообщения об ошибке:

java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view
    +id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe

Проблема произошла после того, как я добавил binding приписывать. Если я его уберу, все снова будет работать нормально. Как правильно использовать binding атрибут?

2 ответа

Решение

Ошибки дублирования идентификатора компонента могут возникать, когда:

  • Один и тот же идентификатор используется для разных компонентов внутри одного и того же NamingContainer,
  • Физически разные компоненты связаны с одним и тем же свойством одного и того же компонента.
  • <f:subview> объявлен на странице включения вместо родительской страницы.
  • Одна и та же страница включения включена несколько раз внутри одной и той же NamingContainer,
  • Компонент был создан динамически без назначенного явного идентификатора.

Вот, NamingContainer среди прочего <h:form>, <h:dataTable> а также <f:subview>,

Когда используешь binding Вы должны связать его со свойством, которое используется исключительно рассматриваемым компонентом на основе запроса. Ваш конкретный случай указывает, что эта привязка используется несколькими компонентами, возможно, для разных запросов. Когда вы связываете компонент со свойством компонента поддержки, компонент поддержки не должен находиться в более широкой области, чем область запроса. См. Также главу 3.1.5 спецификации JSF 2.0 (выделено мной):

3.1.5 Привязки компонентов

...

Привязки компонентов часто используются вместе с JavaBean-компонентами, которые динамически создаются с помощью средства создания управляемых компонентов (см. Раздел 5.8.1 "VariableResolver и VariableResolver по умолчанию"). Настоятельно рекомендуется, чтобы разработчики приложений помещали управляемые bean-компоненты, на которые указывают выражения привязки компонентов, в область "запроса". Это связано с тем, что для помещения его в сессию или область приложения потребуется безопасность потоков, поскольку экземпляры UIComponent зависят от работы внутри одного потока. Также возможно негативное влияние на управление памятью при помещении привязки компонента в область "сеанса".

Смотрите также:

У меня была такая же проблема, пока не нашел этот тег, который исключает дубликат идентификатора компонента

<f:subview id="top">
                <p:outputPanel id="panelHeader1"  
                    binding="#{circularRequestBean.panelHeader}" autoUpdate="true"
                    class="col-md-12 col-sm-12 col-xs-12 col-lg-12 wihtoutPadding"
                    style="padding:0px; !important; display:block;" />

            </f:subview>
Другие вопросы по тегам