Атрибут Binding приводит к дублированию идентификатора компонента, найденного в представлении - PullRequest
13 голосов
/ 20 января 2010

Вот код 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 ]

33 голосов
/ 20 января 2010

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

  • Один и тот же идентификатор используется для разных компонентов внутри одного и того же 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 по умолчанию»). Настоятельно рекомендуется, чтобы разработчики приложений помещали управляемые bean-компоненты, на которые указывают выражения привязки компонентов, в область «запроса». Это связано с тем, что для помещения его в область сеанса или область приложения потребуется безопасность потоков, поскольку экземпляры UIComponent зависят при запуске внутри одного потока. Также возможно негативное влияние на управление памятью при помещении привязки компонента в область «сеанса».

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

0 голосов
/ 16 ноября 2017

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

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...