我有一个具有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中用作remoteCommand,只有在设置了changeListener属性时,我才希望呈现<p:remoteCommand>。
我尝试过几种方法来检查属性是否已设置,特别是:
<c:if test="#{! empty cc.attrs.changeListener}">和
<p:remoteCommand rendered="#{cc.attrs.changeListener != null}" />但是我得到了一个javax.el.PropertyNotFoundException,因为它试图将属性计算为属性。
如何评估是否设置了可选方法属性?
谢谢
发布于 2013-09-23 16:36:35
你对<c:if>的态度已经正确了。rendered的那一个永远不会起作用。您只需要检查是否设置了EL expression,而不是将整个EL表达式实际计算为值表达式,并检查其结果是否为空,如果EL表达式表示方法表达式,当然会失败。
<c:if test="#{not empty cc.getValueExpression('changeListener')}">
...
</c:if>然而,这个解决方案有点吓人:这里将方法表达式作为值表达式获取。但是,只要您不实际计算封闭的EL表达式(就像您最初的#{cc.attrs.changeListener}尝试在幕后所做的那样),那么就没有什么大不了的了。没有其他干净的方法,因为JSF中没有类似于UIComponent#getMethodExpression()的东西。
https://stackoverflow.com/questions/18964325
复制相似问题