У меня есть следующий простой код в составном компоненте (с использованием Mojarra 2.3.9 / Primefaces 7):
<composite:implementation>
<h:form id="form">
<composite:insertChildren />
<ui:fragment rendered="#{!empty cc.facets.actions}">
<div class="actions">
<composite:renderFacet name="actions" />
</div>
</ui:fragment>
</div>
</h:form>
</composite:implementation>
И следующая часть используется на странице, пытаясь заполнить составную форму с помощью life:
<cc:compForm id="mySpecialForm">
<f:facet name="actions">
<p:commandButton
id="myBtn"
value="Submit"
process="@form"
update="@form">
</p:commandButton>
</f:facet>
</cc:compForm>
Форма и все дети отображаются правильно и работают довольно хорошо. Но кнопка в блоке renderFacet имеет - на мой взгляд - неправильный идентификатор клиента, потому что вместо:
mySpecialForm: form: myBtn
кнопка получает только следующий clientId:
mySpecialForm: myBtn
Это приводит к ошибке визуализации страницы:
Не удается найти компонент для выражения "@form "ссылка из" mySpecialForm: myBtn ".: org.primefaces.expression.ComponentNotFoundException: не удается найти компонент для выражения" @form ", ссылка из которого -" mySpecialForm: myBtn ".
Я делаю что-то неправильно или это ошибка в JSF / Primefaces? Я также пытался настроить componentType для @FacesComponent, выходящего из UIForm, но в этом случае форма вообще не будет отображаться.
Обновление 1:
Я пытался создать «минимальный, воспроизводимый пример (представление)», как упомянуто Кукельтье. Все, что нужно, - это две части в веб-приложении (оба файла в ресурсах):
cc / compForm.x html:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:composite="http://xmlns.jcp.org/jsf/composite">
<composite:interface name="compForm" displayName="A composite form">
<composite:facet name="actions" />
</composite:interface>
<composite:implementation>
<h:form id="form">
<composite:insertChildren />
<composite:renderFacet name="actions" />
</h:form>
</composite:implementation>
</html>
compFormTest.x html:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:cc="http://xmlns.jcp.org/jsf/composite/cc">
<cc:compForm id="mySpecialForm">
<h:inputText id="inputParam" value="" />
<f:facet name="actions">
<h:commandButton id="myBtn" value="Test" />
</f:facet>
</cc:compForm>
</html>
Все, что нужно сделать, это вызвать страницу .x html: http:localhost/YOUR_APP/compFormTest.xhtml.
После использования (по крайней мере, с Мохаррой JSF-реализация), поле ввода имеет следующий правильный идентификатор клиента mySpecialForm: form: inputParam. Но командная кнопка извлекает другой идентификатор клиента вне формы: mySpecialForm: myBtn, что с моей точки зрения является ошибкой в отношении JSF VDL: «... будет визуализироваться в этой точке в представлении составного компонента VDL».
Но поскольку я уменьшил количество файлов примеров, это явно не проблема простых лиц, потому что при использовании стандартного компонента h: commandButton также включен неправильный идентификатор клиента.
Возможно, кто-то может использовать вышеупомянутые 2 файла выше в среде MyFaces, чтобы проверить, отличается ли поведение или является таким же?
Или есть кто-то обходной путь? Использование дополнительного @FacesComponent и перемещение кнопки из фасета в нужное место под формой приводит к следующей «забавной» ошибке дублирующегося идентификатора:
"Невозможно добавить один и тот же компонент дважды: mySpecialForm: form: myBtn" (по крайней мере, идентификатор клиента был тем, что я ожидал в первую очередь)