评估是否设置了MethodExpression属性(获取PropertyNotFoundException)

时间:2013-09-23 16:29:09

标签: jsf jsf-2 conditional composite-component methodexpression

我有一个带有MethodExpression属性changeListener的UI组件:

<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 的可选方法表达式,我想仅在<p:remoteCommand>时呈现changeListener }属性已设置。

我尝试了几种检查属性是否设置的方法,尤其是:

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

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

但是我得到了一个javax.el.PropertyNotFoundException,因为它试图将该属性评估为属性。

如何评估是否设置了可选方法属性?

感谢

1 个答案:

答案 0 :(得分:9)

您已经使用<c:if>朝着正确的方向前进了。 rendered一个永远不会起作用。您只需要检查是否已设置EL expression而不是实际将整个EL表达式作为值表达式进行计算并检查其结果是否为空,如果EL表达式表示方法表达式,这当然会失败。

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

然而,这个解决方案有些可怕:你在这里将方法表达式作为值表达式。但是,只要您实际上没有评估所附的EL表达式(就像您的初始#{cc.attrs.changeListener}尝试所做的那样),那么就没有任何意义。没有其他干净的方法,因为JSF API中没有UIComponent#getMethodExpression()