JSF複合コンポーネントutil_primefaces:inplace_nameがあり、エンティティの「name」フィールドが編集されたときに永続性の更新を実行する「マネージャー」バッキングBeanが必要です(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).
[ASIDE:異常な「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: com.example.web.BlockManager@71396a88.onInplaceNameSaveEvent(javax.faces.event.AjaxBehaviorEvent)
javax.el.MethodNotFoundException: Method not found: com.example.web.BlockManager@71396a88.onInplaceNameSaveEvent(javax.faces.event.AjaxBehaviorEvent)
at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155)
Q:複合コンポーネント属性でdefault = "#{blockManager}"を使用すると、バッキングBeanが正しく取得されないのはなぜですか?