验证器属性中找不到EL函数

时间:2013-02-01 19:42:34

标签: jsf el validation

在validator属性中找不到El函数,这取决于动态值或重复值?

Function 'el:min' not found
#{el:min(a + b, c)}
<f:validateLongRange maximum="#{el:min(foo.bar, 10)}"/>

只是打印出值,它在验证器中不起作用的地方工作。

2 个答案:

答案 0 :(得分:2)

这个结构应该可以正常工作。问题很可能是你在那里的变量的范围和时间(即你什么时候需要它们?什么时候他们“在幕后”改变?)。

您需要了解像<f:xxx>这样的标记处理程序在视图构建时(like JSTL <c:xxx>)运行。因此,它们的属性在视图构建期间得到解决,并且将填充bean的默认值。也许您在提交表单时会对它们执行一些业务逻辑,并期望它们会反映到taghandler属性中。但是这是错误的。它们已在视图构建期间进行了评估,并且在处理表单提交期间不会重新评估值。

如果情况确实如此,那么基本上你已经概述了同样的问题,并在这个答案中用各种可能的解决方案回答:How to set converter properties for each row of a datatable?除了为此增加一个Validator,你可以使用OmniFaces <o:validator>

<o:validator validatorId="javax.faces.LongRange" maximum="#{el:min(a + b, c)}" />

答案 1 :(得分:2)

错误消息Function 'el:min' not found如此误导。 问题从来不是构造,但它是嵌套属性的基础NullPointerException

由于在一种情况下,该值取决于不同的组件选择,因此它通过ajax更新,默认值为null。由于默认值为null,因此抛出了这种误导性异常。

该值是嵌套属性,因此未在el函数中捕获

解决方案:在默认情况下禁用验证器

<o:validator validatorId="javax.faces.LongRange" maximum="#{el:min(foo.bar, 10)}"
    disabled="#{foo eq null}"/>