Дублируйте идентификатор компонента в JSF, используя составной компонент дважды в поле зрения

Я «унаследовал» приложение JSF 2 (JSF 2.2.7) в своей компании и столкнулся с java.lang.IllegalStateException, потому что два компонента, похоже, имеют одинаковый идентификатор.

Структура представления выглядит следующим образом (я выделил соответствующий код для иллюстрации, он может содержать некоторые опечатки / неверный синтаксис, поскольку я изменил некоторые имена):

<p:commandButton id="editButton"
   action="#{controller.prepareItem()}"
   update=":itemEditDlg" oncomplete="PF('itemtEditDlg').show()" />


<comp:editItemDlg id="itemEditDlg"  />

<p:dialog id="anotherDlg" >
   <h:form id="anotherForm">
      <c:forEach items="#{controller.allArgs}" var="arg" >
         <!-- next line is the problem -->
         <comp:mycomponent arg="#{arg}"  />
      </c:forEach>
   </h:form>
</p:dialog>

mycomponent.xhtml выглядит следующим образом:

<cc:interface>
    <cc:attribute name="arg" required="true" />
</cc:interface>
<cc:implementation>
    <p:inputText id="argValue" value="#{cc.attrs.arg}" />
    <p:message id="argValueMessage" for="argValue" />
</cc:implementation>

Важное замечание: компонент mycomponent также используется внутри editItemDlg (так же, как в "anotherDlg"), то есть в диалоге и цикле forEach)

Если я нажимаю кнопку редактирования, я получаю:

java.lang.IllegalArgumentException: Component ID anotherForm:j_idt192:argValue  
has already been found in the view.

Это довольно странно, потому что "anotherDlg" в этом случае не openend, но, видимо, уже отрендерено.

Я получаю следующую информацию в StackTrace (показаны только соответствующие части):

         +id: j_idt192
             type: javax.faces.component.UINamingContainer@399bd0dc
              +id: j_id2
               type: javax.faces.component.UIPanel@24ad3910
                +id: argValue  <===============
                 type: org.primefaces.component.inputtext.InputText@687d5c3f
                +id: argValueMessage
                 type: org.primefaces.component.message.Message@7e3361b0
                +id: argValue  <===============
                 type: org.primefaces.component.inputtext.InputText@5f52aa8a
                +id: argValueMessage
                 type: org.primefaces.component.message.Message@2c3a7aea

Так или иначе, эти компоненты визуализируются дважды, но я не могу понять, почему.

Я прошел черезТак ответь но я не могу точно определить, какая из перечисленных причин является проблемой в моем случае. Я не использую никаких привязок.

То, что я пробовал до сих пор: поиграть с установкой id явно, то есть окружить mycomonent с, передать счетчики циклов в качестве ID для компонента и т. Д., Но безуспешно. Я думаю, что проблема не может быть решена в рамках моего компонента. Единственный обходной путь, который я нашел, состоял в том, чтобы сделать физическую копию mycomponent и сослаться на эту копию в моем anotherForm (так, чтобы editItemDlg и anotherDlg не использовали одни и те же компоненты).

Любая помощь приветствуется

Ответы на вопрос(2)

Ваш ответ на вопрос