У меня проблема с дублированными идентификаторами в моем приложении JSF. Я прочитал в этом сообщении, что одним из возможных решений является использование Naming Container. Можете ли вы привести мне пример использования контейнера для именования, чтобы избежать дублирования проблемы с идентификаторами? Я использую Facelets.
Jsf Как создать контейнер именования
Ответ 1
Это то, что сработало для меня, используя JSF1.2 и facelets:
Я обнаружил, что ни <ui:composition>, ни <ui:component> на самом деле не является именованным контейнером, поэтому использование одного и того же компонента более одного раза в одной и той же форме завершится неудачей с дублированием исключения. Это кажется плохим дизайном, поскольку весь компонент компонентов - это повторное использование. Чтобы обойти эту проблему, я включаю <f:subview> внутри каждого компонента и устанавливаю на нем идентификатор в качестве параметра моего тега компонента:
myComponent.xhtml:
<ui:component>      
    <f:subview id="#{id}">
        ....component code
    </f:subview>
</ui:component>
и использование его на других страницах просто (после правильной настройки taglib.xml и web.xml):
<myTagLib:myComponent id="myCompA" />
Ответ 2
Я предлагаю сделать шаг назад и исследовать причину возникновения проблемы с дублирующимся идентификатором. После того, как вы пригвоздили основную причину, просто исправьте ее "обычным" способом, а не создайте свой собственный компонент UINamingContainer.
Существует несколько возможных причин дублирования ошибок идентификатора, которые должны помочь вам еще больше убрать его:
-  Тот же идентификатор используется для разных UIComponentвнутри одного и того же компонентаUINamingContainer.
-  Физически разные компоненты связаны с одним и тем же свойством UIComponentтого же bean.
-  Только JSP: f:subviewобъявлен на родительской странице, а не на странице включения.
-  Одна и та же страница включает несколько раз внутри одного и того же компонента UINamingContainer.
-  Компонент динамически построен (например, new UIComponent()) без присвоения идентификатора.
Здесь UINamingContainer находится под каждым <h:form>, <h:dataTable> и <f:subview>.
Если приведенные выше предложения не помогают, обновите свой вопрос, чтобы включить наименьший возможный фрагмент кода (таким образом, без всякого ненужного кода/беспорядка, такого как несвязанные компоненты, библиотеки, HTML/CSS/JS/etc), который воспроизводит точные та же проблема, просто скопировав ее, не изменив ее без каких-либо изменений.
