【发布时间】:2013-01-17 05:00:49
【问题描述】:
使用withinvalidator属性找不到El函数,依赖于动态或重复值?
Function 'el:min' not found
#{el:min(a + b, c)}
<f:validateLongRange maximum="#{el:min(foo.bar, 10)}"/>
仅打印出值在验证器中不起作用的地方起作用。
【问题讨论】:
标签: jsf el validation
使用withinvalidator属性找不到El函数,依赖于动态或重复值?
Function 'el:min' not found
#{el:min(a + b, c)}
<f:validateLongRange maximum="#{el:min(foo.bar, 10)}"/>
仅打印出值在验证器中不起作用的地方起作用。
【问题讨论】:
标签: jsf el validation
错误消息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}"/>
【讨论】:
这个结构应该可以正常工作。问题很可能是你在那里的变量的范围和时间(即你什么时候需要它们?它们什么时候“幕后”改变了?)。
您需要了解像 <f:xxx> 这样的标记处理程序在视图构建期间运行 (like JSTL <c:xxx>)。因此,它们的属性在视图构建期间被解析,并且将填充 bean 的默认值。也许您在提交表单时正在对它们执行一些业务逻辑,并期望它们会反映到 taghandler 属性中。但是这是错误的。它们已经在视图构建期间进行了评估,并且不会在处理表单提交期间重新评估这些值。
如果情况确实如此,那么您基本上遇到了相同的问题,该问题已经在此答案中概述并用各种可能的解决方案进行了回答:How to set converter properties for each row of a datatable? 除了家庭种植Validator 之外,您可以使用@987654323 @<o:validator>为此:
<o:validator validatorId="javax.faces.LongRange" maximum="#{el:min(a + b, c)}" />
【讨论】: