我有一個JSF複合組件util_primefaces:inplace_name需要一個「管理器」支持bean,當實體的「名稱」字段時執行持久性更新被編輯(使用對:就地):JSF複合組件支持bean EL表達式作爲默認的必需屬性失敗,方法未知
<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圖塊管理員最終延伸的AbstractManager,它有一個監聽方法:
public void onInplaceNameSaveEvent(AjaxBehaviorEvent ae).
[ASIDE:爲異常的原因「elid」attrib UTE這裏所描述的,它在這個問題沒有進一步的作用:Primefaces p:inplace: How to more elegantly propagate the EL expression for entity to merge]
當我調用傳遞的顯式#{圖塊管理員}(或AbstractManager的其他子類)的複合材料部件,它工作正常:
<util_primefaces:inplace_name
element="#{tenancy}"
elid="tenancy"
manager="#{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}」時支持bean未正確使用?
非常感謝。順便說一句,我嘗試了幾個相關的實驗,好奇的結果,例如,如果定義一個屬性name =「testInteger」type =「java.lang.Integer」default =「1a」(注意默認字符串中的故意字母字符) :outputText value =#{cc.attrs。testInteger}「它輸出可以作爲** 1a **(不是整數),當我調用沒有顯式testInteger的組件時,但是如果我用testInteger =」1b「調用複合組件,它會按預期的方式失敗並帶NumberFormatException – 2012-07-23 07:58:35
有趣。 ..也會對我自己做一些測試!謝謝!:) – elias 2012-07-23 11:41:55
用示例測試更新了答案;) – elias 2012-07-23 13:02:30