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

Вот код JSF:

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

И вот часть поддержки bean для поддержки привязки:

private HtmlInputText input;

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

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

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

java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view
    +id: inputId type: [email protected]

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

Ответ 1

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

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

Здесь NamingContainer является, среди прочих, <h:form>, <h:dataTable> и <f:subview>.

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

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

...

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

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

Ответ 2

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

<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>