0

javax.el.PropertyNotWritableException在尝试将表格的长度存储在JavaScript的隐藏输入中时遇到了问题:

Caused by: javax.el.PropertyNotWritableException: /view/ci/buttons.xhtml at line 34 and column 73 value="#{fn:length(order.phases)}": Illegal Syntax for Set Operation
    at org.apache.myfaces.view.facelets.el.TagValueExpression.setValue(TagValueExpression.java:125)

JSF:

<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/>

我不明白那个错误,fn:length 支持只读操作,还是我遗漏了什么?

4

2 回答 2

3

这种行为是完全可以预料的。<h:inputHidden>也在表单提交时处理。这允许通过 JavaScript 对隐藏值进行操作。但是,EL 函数调用不是有效的 setter 方法操作。因此有这个例外。与其他所有UIInput组件一样,该值必须是一个完全有价值的 bean 属性。

鉴于您将变量传递给 JavaScript 的具体功能要求,<h:inputHidden>实际上是错误的工具。只需让 JSF 将其打印为 JS 变量即可:

<script>var phasesCount = #{fn:length(order.phases)};</script>

或者,如果您确实需要一个隐藏的输入元素,即使它在服务器端没有完全使用,那么请改用纯 HTML 元素:

<input type="hidden" id="phasesCount" value="#{fn:length(order.phases)}" />

请注意,您也可以对同一作业使用完全任意的 HTML 元素或属性:

<div id="phasesCount" data-phasesCount="#{fn:length(order.phases)}">

这个值也可以通过 JS 方式访问。

于 2013-01-21T18:33:16.683 回答
0
<h:inputHidden id="phasesCount" value="#{fn:length(order.phases)}"/>

inputHidden是一个输入控件。提交表单时, JSF 将尝试在此表达式上调用setValue 。

于 2013-01-21T16:31:58.240 回答