Дублируйте идентификатор компонента в 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 не использовали одни и те же компоненты).
Любая помощь приветствуется