Фрагмент JSF 2.3 в составном компоненте с неправильным идентификатором - PullRequest
3 голосов
/ 24 марта 2020

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

...