在依赖于动态或重复值的验证器属性中找不到El函数?
Function 'el:min' not found
#{el:min(a + b, c)}
<f:validateLongRange maximum="#{el:min(foo.bar, 10)}"/>
只需打印出该值就可以在验证器中不起作用的地方起作用。
在依赖于动态或重复值的验证器属性中找不到El函数?
Function 'el:min' not found
#{el:min(a + b, c)}
<f:validateLongRange maximum="#{el:min(foo.bar, 10)}"/>
只需打印出该值就可以在验证器中不起作用的地方起作用。
这个构造应该可以正常工作。问题很可能是你在那里的变量的范围和时间(即你什么时候需要它们?它们什么时候“在幕后”改变了?)。
您需要了解标签处理程序喜欢<f:xxx>
在视图构建期间运行(如 JSTL<c:xxx>
)。因此,它们的属性在视图构建期间被解析,并且将填充 bean 的默认值。也许您在提交表单时正在对它们执行一些业务逻辑,并期望它们会反映到 taghandler 属性中。但是这是错误的。它们已经在视图构建期间进行了评估,并且在处理表单提交期间不会重新评估这些值。
如果确实是这种情况,那么您基本上遇到了相同的问题,该问题已经在此答案中概述并用各种可能的解决方案进行了回答:如何为数据表的每一行设置转换器属性?除了为此进行家庭种植之外Validator
,您还可以为此使用OmniFaces <o:validator>
:
<o:validator validatorId="javax.faces.LongRange" maximum="#{el:min(a + b, c)}" />
错误信息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}"/>