4

在依赖于动态或重复值的验证器属性中找不到El函数?

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

只需打印出该值就可以在验证器中不起作用的地方起作用。

4

2 回答 2

2

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

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

如果确实是这种情况,那么您基本上遇到了相同的问题,该问题已经在此答案中概述并用各种可能的解决方案进行了回答:如何为数据表的每一行设置转换器属性?除了为此进行家庭种植之外Validator,您还可以为此使用OmniFaces <o:validator>

<o:validator validatorId="javax.faces.LongRange" maximum="#{el:min(a + b, c)}" />
于 2013-02-01T20:07:06.843 回答
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}"/>
于 2013-02-02T01:26:36.423 回答