首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算是否设置了MethodExpression属性(获取PropertyNotFoundException)

计算是否设置了MethodExpression属性(获取PropertyNotFoundException)
EN

Stack Overflow用户
提问于 2013-09-23 16:29:09
回答 1查看 1.7K关注 0票数 6

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

代码语言:javascript
复制
<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>

我尝试过几种方法来检查属性是否已设置,特别是:

代码语言:javascript
复制
<c:if test="#{! empty cc.attrs.changeListener}">

代码语言:javascript
复制
<p:remoteCommand rendered="#{cc.attrs.changeListener != null}" />

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

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 16:36:35

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

代码语言:javascript
复制
<c:if test="#{not empty cc.getValueExpression('changeListener')}">
     ...
</c:if>

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18964325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档