2013-09-23 24 views
6

Mam składnik UI z atrybutem MethodExpression changeListener:dokonania oceny atrybut MethodExpression jest ustawiony (coraz 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> 

Ten atrybut changeListener jest opcjonalnym wyrażenie metoda stosowana jako ActionListener w remoteCommand i Chcę renderować TYLKO JEŚLI atrybut changeListener został ustawiony.

Próbowałem kilka sposobów, aby sprawdzić, czy atrybut jest ustawiony, czy nie, w szczególności:

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

i

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

Ale dostaję javax.el.PropertyNotFoundException ponieważ próbuje ocenić zamiast tego atrybut jako właściwość.

Jak mogę ocenić, czy opcjonalny atrybut metody jest ustawiony, czy nie?

dzięki

Odpowiedz

7

można było w dobrym kierunku z już <c:if>. Ten rendered nigdy nie zadziała. Trzeba tylko sprawdzić, czy ustawiono EL expression zamiast faktycznie oceniać całe wyrażenie EL jako wyrażenie wartości i sprawdzać, czy jego wynik nie jest pusty, co oczywiście zawiedzie, jeśli wyrażenie EL reprezentuje wyrażenie metody.

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

To rozwiązanie jest jednak nieco przerażające: łapiesz wyrażenie metody jako wyrażenie wartości tutaj. Jednak dopóki nie ocenisz zamkniętego wyrażenia EL (tak jak to, co twoja pierwsza próba zrobiła pod kołdrą), nie ma w nim nic. Nie ma innego prostego sposobu, ponieważ nie ma to jak UIComponent#getMethodExpression() w JSF API.