ID do componente duplicado no JSF usando o componente composto duas vezes em exibição
Eu "herdei" um aplicativo JSF 2 (JSF 2.2.7) na minha empresa e enfrentei um java.lang.IllegalStateException porque dois componentes parecem ter o mesmo ID.
A estrutura da exibição é a seguinte (extraí o código relevante para fins de ilustração, ele pode conter alguns erros de digitação / sintaxe inválida ao alterar alguns nomes):
<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 tem a seguinte aparência:
<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>
Importante: O componente mycomponent também é usado dentro de editItemDlg (da mesma maneira que em "anotherDlg"), ou seja, dentro de uma caixa de diálogo e forEach-loop
Se eu clicar no botão edit, recebo:
java.lang.IllegalArgumentException: Component ID anotherForm:j_idt192:argValue
has already been found in the view.
É bastante estranho, porque o "anotherDlg" não é aberto neste caso, mas aparentemente já foi renderizado.
Recebo as seguintes informações no StackTrace (apenas as partes relevantes mostradas):
+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
Então, de alguma forma, esses componentes são renderizados duas vezes, mas não consigo entender o porquê.
Eu fui atravésEntão responde mas não consigo determinar qual das causas listadas é o problema no meu caso. Eu não uso nenhuma ligação.
O que eu tentei até agora: brinquei com a definição de identificação de forma explícita, ou seja, ao redor do meu componente, passando contadores de loop como identificação para o componente etc. sem sucesso. Eu acho que o problema não pode ser resolvido dentro do meu componente. A única solução alternativa que encontrei foi fazer uma cópia física do meu componente e fazer referência a essa cópia no meu anotherForm (de modo que editItemDlg e anotherDlg não usem os mesmos componentes).
Qualquer ajuda é apreciada