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

Вот код 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-адреса на другой вкладке или любым другим способом), я получаю ошибку дублирующего идентификатора. В сообщении об ошибке говорится, что <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?


person Roman    schedule 20.01.2010    source источник


Ответы (2)


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

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

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

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

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

...

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

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

person BalusC    schedule 20.01.2010
comment
Компонент поддержки имеет область сеанса. Этот компонент используется только этим компонентом. Что вы имеете в виду, говоря «исключительно»? - person Roman; 20.01.2010
comment
Таким образом, разные запросы/представления внутри одного сеанса используют одну и ту же привязку? Это тоже не всегда будет работать. Поместите его в bean-компонент области запроса. - person BalusC; 20.01.2010
comment
Я собираюсь вообще избежать привязки и найти подходящий обходной путь. Но мне просто интересно, это нормальное поведение привязки (т.е. из спецификации)? Получу ли я тот же результат со стандартными компонентами jsf? Или это зависит? - person Roman; 20.01.2010
comment
Хм? Просто введите область запроса и используйте ее дальше. Вы даже можете сделать его дочерним элементом сеансового компонента. Другая причина также может заключаться в том, что компонент использовался в файле включения/композиции, а также в том, что он был включен/повторно использован несколько раз на одной и той же странице. - person BalusC; 20.01.2010
comment
Спасибо за список возможных проблем. Его второй элемент дал мне представление о том, что метод getLineChartComponent() должен возвращать значение null (в моем случае он не нарушает никаких функций, меня интересует метод установки). - person Roman; 20.01.2010
comment
Для справки: в JSF 2.2 была ошибка (JAVASERVERFACES-4240). .12, что также вызвало исключение дублирования идентификатора. Проблема была окончательно исправлена ​​в JSF 2.2.15. См. также этот вопрос SO для получения подробной информации. - person Martin Höller; 25.10.2018

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

<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>
person Marcos Lopez Uchiha    schedule 16.11.2017