2013-09-23 20 views
6

我有一個UI組件與MethodExpression的屬性changeListener評估如果MethodExpression的屬性設置(獲得PropertyNotFoundException)

<composite:interface> 
    <composite:attribute name="changeListener" required="false" method-signature="void actionListener(javax.faces.event.ActionEvent)" /> 
    .. 
</composite:interface> 
<composite:implementation> 

    <p:remoteCommand name="ajaxOnChange" 
          update="#{cc.attrs.onChangeUpdate}" 
          oncomplete="#{cc.attrs.onchange}" 
          actionListener="#{cc.attrs.changeListener}" /> 
    .. 
</composite:implementation> 

changeListener屬性處於remoteCommand並用作的ActionListener一種可選方法表達如果已設置changeListener屬性,我只想渲染<p:remoteCommand>

我曾嘗試多種方法可檢查屬性是否設置與否,尤其是:

<c:if test="#{! empty cc.attrs.changeListener}"> 

<p:remoteCommand rendered="#{cc.attrs.changeListener != null}" /> 

但我得到一個javax.el.PropertyNotFoundException因爲它試圖評估該屬性作爲屬性來代替。

如何評估可選方法屬性是否已設置?

感謝

回答

7

你是在<c:if>已經朝着正確的方向。 rendered一個永遠不會工作。您只需檢查EL expression是否已設置,而不是實際將整個EL表達式評估爲值表達式,並檢查其結果是否爲空,如果EL表達式表示方法表達式,則當然會失敗。

<c:if test="#{not empty cc.getValueExpression('changeListener')}"> 
    ... 
</c:if> 

然而,這個解決方案有點嚇人:你在這裏抓取方法表達式作爲一個值表達式。然而,只要你沒有實際評估封閉的EL表達(就像你最初嘗試在封面下做的那樣),那麼沒有任何事情可做。沒有其他乾淨的方式,因爲在JSF API中沒有任何東西像UIComponent#getMethodExpression()