2013-09-23 24 views
6

Ho un componente di interfaccia utente con un attributo MethodExpression changeListener:valutare attributo MethodExpression è impostato (ottenendo 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> 

Questo attributo changeListener è un metodo espressione opzionale usato come ActionListener nel remoteCommand e Voglio rendere il <p:remoteCommand> SOLO SE è stato impostato l'attributo changeListener.

Ho provato diversi modi per verificare se l'attributo è impostato o meno, in particolare:

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

e

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

Ma io ottenere un javax.el.PropertyNotFoundException perché cerca di valutare l'attributo come una proprietà invece.

Come valutare se l'attributo del metodo opzionale è impostato o meno?

grazie

risposta

7

Lei è stato nella direzione giusta con <c:if> già. Lo rendered non funzionerà mai. È solo necessario verificare se è stato impostato EL expression invece di valutare l'intera espressione EL come un'espressione di valore e controllare se il suo risultato non è vuoto, che naturalmente fallirebbe se l'espressione EL rappresentasse un'espressione di metodo.

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

Questa soluzione è comunque un po 'spaventosa: si sta prendendo l'espressione del metodo come espressione di valore qui. Tuttavia, a patto che non si valuti realmente l'espressione EL allegata (come quella che il tuo tentativo iniziale #{cc.attrs.changeListener} fa sotto le copertine), allora non c'è niente in questione. Non c'è altro modo pulito in quanto non c'è niente come UIComponent#getMethodExpression() in API JSF.