【问题标题】:EL function not found in validator attribute在验证器属性中找不到 EL 函数
【发布时间】: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


    【解决方案1】:

    错误消息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}"/>
    

    【讨论】:

      【解决方案2】:

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

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

      如果情况确实如此,那么您基本上遇到了相同的问题,该问题已经在此答案中概述并用各种可能的解决方案进行了回答:How to set converter properties for each row of a datatable? 除了家庭种植Validator 之外,您可以使用@987654323 @&lt;o:validator&gt;为此:

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

      【讨论】:

      • 总是同样的问题,查看和构建时间。为什么这些组件被设计为在构建期间运行,这肯定存在很大的性能问题。这并没有解决问题,但对我来说仍然是一个问题。您的回答无疑节省了时间或新问题,并导致了我找到的解决方案^^
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2012-01-07
      • 1970-01-01
      • 2016-12-21
      • 2012-02-29
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多