Ответ 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 зависят от работы внутри одного потока. Также потенциально негативное влияние на управление памятью при размещении привязки компонента в области "сеанс".