执行fn:length时的PropertyNotWritableException

时间:2013-01-21 16:14:58

标签: java jsf facelets el

我尝试将表格的长度存储在 JavaScript 的隐藏输入中时javax.el.PropertyNotWritableException

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是否支持只读操作,或者我错过了什么?

2 个答案:

答案 0 :(得分: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也可以访问此值。

答案 1 :(得分:0)

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

inputHiddeninput control。在提交表单时,JSF将尝试在此表达式上调用setValue