评估复合组件中是否设置了 MethodExpression 属性(获取 PropertyNotFoundException)

问题描述 投票:0回答:1

我有一个带有 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
属性是一个可选方法表达式,用作 remoteCommand 中的
actionListener
,我想仅在设置了
<p:remoteCommand>
属性时才渲染
changeListener

我尝试了多种方法来检查属性是否设置,特别是:

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

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

但是我得到了

javax.el.PropertyNotFoundException
,因为它尝试将属性评估为属性。

如何判断是否设置了可选方法属性?

谢谢

jsf conditional-statements composite-component methodexpression
1个回答
9
投票

您已经在正确的方向上

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

<c:if test="#{not empty cc.getValueExpression('changeListener')}">
     ...
</c:if>
然而,这个解决方案有点可怕:您在这里将方法表达式作为值表达式。然而,只要您没有实际评估所包含的 EL 表达式(就像您最初的

#{cc.attrs.changeListener}

 尝试在幕后所做的那样),那么就没有什么问题。没有其他干净的方法,因为 JSF API 中没有像 
UIComponent#getMethodExpression()
 这样的东西。

© www.soinside.com 2019 - 2024. All rights reserved.