【发布时间】:2012-07-20 17:46:45
【问题描述】:
我有一个 JSF 复合组件 util_primefaces:inplace_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: How to more elegantly propagate the EL expression for entity to merge]
当我调用传入显式 #{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)
问:为什么在复合组件属性中使用 default="#{blockManager}" 没有正确获取 backing bean?
【问题讨论】:
标签: jsf jsf-2 default composite-component