6

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

<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属性是一个可选的方法表达式,用作actionListener中的,remoteCommand并且我想<p:remoteCommand>changeListener在设置了该属性时才呈现。

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

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

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

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

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

谢谢

4

1 回答 1

9

你已经在正确的方向<c:if>。一个rendered永远不会工作。您只需要检查是否设置了EL 表达式,而不是将整个 EL 表达式实际评估为值表达式并检查其结果是否不为空,如果 EL 表达式表示方法表达式,这当然会失败。

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

然而,这个解决方案有点吓人:您在这里将方法表达式作为值表达式来获取。但是,只要您不实际评估封闭的 EL 表达式(就像您最初#{cc.attrs.changeListener}尝试在幕后所做的那样),那么就没有任何问题。没有其他干净的方法,因为UIComponent#getMethodExpression()在 JSF API 中没有任何东西。

于 2013-09-23T16:36:35.340 回答