У меня есть составной компонент JSF util_primefaces:inplace_name, для которого требуется вспомогательный компонент «менеджер», который выполняет постоянные обновления при редактировании поля «имя» объекта (с использованием p: inplace):
<cc:interface>
<cc:attribute name="manager" type="com.example.web.AbstractManager" required="false" default="#{blockManager}"/>
<cc:attribute name="element" type="com.example.entity.Element" required="true"/>
<cc:attribute name="elid" required="true"/>
<cc:attribute name="update" required="false" default="@parent"/>
..
</cc:interface>
<cc:implementation>
..
<p:inplace id="#{cc.attrs.elid}" editor="true" emptyLabel="UNDEF" >
<p:ajax
event="save"
listener="#{cc.attrs.manager.onInplaceNameSaveEvent}"
process="@this #{cc.attrs.elid}-name"
update="#{cc.attrs.update}"
/>
<h:inputText id="#{cc.attrs.elid}-name" value="#{cc.attrs.element.name}"/>
..
Где, например, @ViewScoped @ManagedBean BlockManager в конечном итоге расширяет AbstractManager, у которого есть метод слушателя:
public void onInplaceNameSaveEvent(AjaxBehaviorEvent ae).
[ПОДДЕРЖКА: здесь описана причина необычного атрибута "elid", он больше не играет роли в этом вопросе: Primefaces p:inplace: Как более элегантно распространять выражение EL для объединения объектов ]
Когда я вызываю составной компонент, передающий явный #{blockManager} (или другой подкласс AbstractManager), он работает нормально:
<util_primefaces:inplace_name
element="#{tenancy}"
elid="tenancy"
manager="#{blockManager}"
/>
Но если я не передам #{blockManager}, при выполнении редактирования и сохранения на месте я получаю сообщение об ошибке, что метод onInplaceNameSaveEvent(AjaxBehaviorEvent) неизвестен:
<util_primefaces:inplace_name
element="#{tenancy}"
elid="tenancy"
/>
Ошибка:
WARNING: Method not found: [email protected](javax.faces.event.AjaxBehaviorEvent)
javax.el.MethodNotFoundException: Method not found: [email protected](javax.faces.event.AjaxBehaviorEvent)
at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155)
В: Почему вспомогательный компонент не принимается правильно, используя default="#{blockManager}" в атрибуте составного компонента?