Jsf Как создать контейнер именования

У меня проблема с дублированными идентификаторами в моем приложении JSF. Я прочитал в этом сообщении, что одним из возможных решений является использование Naming Container. Можете ли вы привести мне пример использования контейнера для именования, чтобы избежать дублирования проблемы с идентификаторами? Я использую Facelets.

Ответ 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), который воспроизводит точные та же проблема, просто скопировав ее, не изменив ее без каких-либо изменений.