2013-09-23 15 views
6

Tôi có một thành phần giao diện người dùng với một thuộc tính MethodExpression changeListener:đánh giá nếu MethodExpression thuộc tính được thiết lập (nhận 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 Thuộc tính này là một biểu hiện phương pháp bắt buộc sử dụng như ActionListener trong remoteCommand và Tôi muốn chỉ hiển thị <p:remoteCommand> CHỈ NẾU thuộc tính changeListener đã được đặt.

Tôi đã thử một số cách để kiểm tra xem các thuộc tính được thiết lập hay không, đặc biệt là:

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

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

Nhưng tôi nhận được một javax.el.PropertyNotFoundException vì nó cố gắng để đánh giá thay vào đó là thuộc tính làm thuộc tính.

Làm cách nào để đánh giá xem thuộc tính phương thức tùy chọn có được đặt hay không?

cảm ơn

Trả lời

7

Bạn đã đi đúng hướng với <c:if> rồi. rendered không bao giờ hoạt động. Bạn chỉ cần kiểm tra xem liệu EL expression có được đặt thay vì thực sự đánh giá toàn bộ biểu thức EL như một biểu thức giá trị và kiểm tra xem kết quả của nó không trống không, tất nhiên sẽ thất bại nếu biểu thức EL biểu thị một biểu thức phương thức.

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

Giải pháp này tuy hơi đáng sợ: bạn đang lấy biểu thức phương thức làm biểu thức giá trị tại đây. Tuy nhiên, miễn là bạn không thực sự đánh giá biểu thức EL kèm theo (giống như những gì mà nỗ lực ban đầu của bạn là #{cc.attrs.changeListener} không nằm trong bìa), thì chẳng có gì quan trọng cả. Không có cách nào khác rõ ràng vì không có gì giống như UIComponent#getMethodExpression() trong JSF API.

Các vấn đề liên quan