【问题标题】:PropertyNotFoundException EL Expressions not resolving?PropertyNotFoundException EL 表达式无法解析?
【发布时间】:2013-05-01 17:02:15
【问题描述】:

我的 facelet 中有类似的代码...

<c:foreach items=#{myBean.listOfA} var="a">

<c:foreach items=#{myBean.listOfB} var="b">

 <c:set var="aName" value="#{a.name}">
 <c:set var="component" value="#{b.associatedComponent(aName)}">//this wont resolve

 //do stuff with component

</c:foreach>


</c:foreach>

myBean 是一个会话范围的 bean。 A 和 B 类都在 bean 内的列表中维护,但只是模型对象而不是托管 bean。

也就是说,我假设的方法 b.associatedComponent(a) 应该解析为我已经检查过很多次的 b.getAssociatedComponent(A a)。所有方法都是公开的。我该怎么做才能使 EL 可以访问该方法?

无论我尝试什么,我都会在相关组件上得到一个 PropertyNotFoundException。

附:我也试过像这样把方法移到bean上...

<c:set var="component" value="#{myBean.associatedComponent(b, aName)}">

这也不起作用并抛出相同的 PropertyNotFoundException。

【问题讨论】:

  • AFAIK,如果该方法接受一个参数,它就不再是一个 getter,因此 EL 会寻找一个方法 associatedComponent(A),而不是 getAssociatedComponent(A)
  • @JB Nizet 我也尝试将其重命名为 associatedComponent(A),但没有成功,我会重试。
  • @JBNizet 我确认将方法重命名为完全“关联组件(A)”并没有解决问题。
  • 你的环境是什么?您部署到的服务器是什么?您是否知道使用参数调用方法只是自 EL 2.2 以来的一个选项,它与 Servlet 3.0 密切相关?
  • 我正在使用 EL 2.2 myBean.list.size() 没有问题,所以我很确定这不是问题。

标签: jsf exception jstl el


【解决方案1】:

这不起作用,因为c:set 标记需要ValueExpression 用于value 属性。 这意味着您只能使用属性,而不是方法。

如果您使用像#{b.associatedComponent(aName)} 这样的参数,那么您所拥有的是方法调用,而不是属性调用。然而,这是一个有效的MethodExpression,可以在命令链接的action 属性等位置使用。 请参阅API documentationspec 了解更多详情。

【讨论】:

  • 有什么我可以用来调用 forEach 中的 MethodExpression 的吗?像 f:event 什么的?然后我可以使用一个简单的值表达式进行检索。喜欢一套然后get?
  • 据我了解,问题是遍历两个以某种方式关联的列表,对吗?那么为什么不使用地图来简化情况,例如here。这可行吗?
  • 在内部我使用的是地图,所以您认为我可以使用 #{B.associatedComponents[aName]} 之类的东西吗?我现在正在尝试。
猜你喜欢
  • 1970-01-01
  • 2012-07-03
  • 2011-03-25
  • 1970-01-01
  • 2017-09-22
  • 2012-02-10
  • 2013-02-06
  • 2016-01-21
  • 2017-03-28
相关资源
最近更新 更多