У меня на странице есть пользовательский компонент с фасетом внутри
<jtcomp:blockUI ...>
<f:facet name="events">
<f:param name="filtering" value="true"/>
<f:param name="sorting" value="true"/>
<f:param name="paging" value="true"/>
</f:facet>
...
</jtcomp:blockUI>
В классе рендерера я собираюсь собрать все параметры UIP (f: param). Сначала я получаю аспект следующим образом
UIComponent facet = blockUI.getFacet("events");
Хорошо. Теперь я подумал, что могу вызвать facet.getChildren () и выполнить итерацию для всех потомков. Но я отладил и понял, что могу это сделать, только если f: facet содержит более одного компонента f: param. Если у него есть только один f: param, как это
<jtcomp:blockUI ...>
<f:facet name="events">
<f:param name="filtering" value="true"/>
</f:facet>
...
</jtcomp:blockUI>
вызов выше доставляет уже этот компонент. Я имею в виду, фасет является параметром UIP. Поэтому вся логика выглядит как
// collect all f:param
List<UIParameter> uiParams = new ArrayList<UIParameter>();
if (facet instanceof UIParameter) {
// f:facet has one child and that's f:param
uiParams.add((UIParameter) facet);
} else if (facet != null && facet.getChildren() != null) {
// f:facet has no or more than one child
for (UIComponent kid : facet.getChildren()) {
if (kid instanceof UIParameter) {
uiParams.add((UIParameter) kid);
}
}
}
Это ожидаемое поведение JSF или просто ошибка Mojarra (я использую Mojarra 2.1.0-b02)? Я знаю, что до JSF2 только одному компоненту разрешалось находиться внутри f: facet. Возможно, они все еще проверяют это и не создают экземпляр FacetsMap, если доступен только один дочерний компонент. Вместо FacetsMap, содержащего все дочерние компоненты, дочерний компонент самостоятельно связывается как фасет с родительским компонентом.
Что ты думаешь? Я ничего не мог найти в спецификации JSF. Заранее спасибо за ваши ответы!