Komponenten-ID in JSF mithilfe der zusammengesetzten Komponente zweimal in der Ansicht duplizieren

Ich habe eine JSF 2 (JSF 2.2.7) -Anwendung in meinem Unternehmen "geerbt" und sehe mich einer java.lang.IllegalStateException gegenüber, da zwei Komponenten anscheinend dieselbe ID haben.

Die Struktur der Ansicht ist wie folgt (ich habe den relevanten Code zu Illustrationszwecken extrahiert, er kann Tippfehler / ungültige Syntax enthalten, da ich einige Namen geändert habe):

<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 sieht folgendermaßen aus:

<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>

Wichtig: Die Komponente mycomponent wird auch in editItemDlg verwendet (auf die gleiche Weise wie in "anotherDlg"), d. H. In einem Dialog und in forEach-loop.

Wenn ich auf den editButton klicke, erhalte ich:

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

Es ist eher seltsam, weil das "anotherDlg" in diesem Fall nicht offen ist, sondern anscheinend schon gerendert wird.

Ich erhalte die folgenden Informationen im StackTrace (nur relevante Teile werden angezeigt):

         +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

So irgendwie werden diese Komponenten zweimal gerendert, aber ich kann nicht herausfinden, warum.

Ich habe durch gegangen SO antworte aber ich kann nicht wirklich feststellen, welche der aufgelisteten Ursachen das Problem in meinem Fall ist. Ich verwende keine Bindungen.

Was ich bisher versucht habe: Es wurde versucht, die ID ausschließlich festzulegen, d. H. Meine Komponente mit zu umgeben, Schleifenzähler als ID an die Komponente zu übergeben usw., ohne Erfolg. Ich denke, das Problem kann in mycomponent nicht gelöst werden. Die einzige Problemumgehung, die ich gefunden habe, war, eine physische Kopie meiner Komponente zu erstellen und auf diese Kopie in meiner anotherForm zu verweisen (so dass editItemDlg und anotherDlg nicht dieselben Komponenten verwenden).

Jede Hilfe wird gebeten

Antworten auf die Frage(4)

Ihre Antwort auf die Frage