【问题标题】:How to prevent a a null value as the new value for ValueChangedEvent?如何防止空值作为 ValueChanged 事件的新值?
【发布时间】:2013-02-06 13:51:30
【问题描述】:

在输入类型字段中,我的 jsp 中的 value 属性有一个值绑定到 double 类型的变量(让我们调用 foo)。我有一个 foo 的 setter 和一个 getter,还有一个 ValueChangedListener 为此输入注册。该字段的 autosubmit 属性设置为 true 。当用户清除输入并导航到下一个字段时,valueChangedListener 中的代码被调用,ValueChangedEventnewValue 变为 null 。我怎样才能防止这种情况?

我尝试从 setter 方法处理这个问题,但似乎 setter 没有被调用,valueChangedListener 被首先调用。规范不是说应该首先调用 setter 来将用户编辑的值填充到组件中,然后只触发 ValueChangedListener 吗?

P.S:我使用 ADF RichInputText 作为输入,但我认为它与 ADF 无关,而是与核心 JSF 机制有关。因此不将其标记为 ADF 问题。

【问题讨论】:

  • 功能需求是什么?为什么要阻止这种情况?这是完全预期的行为。至于调用顺序,也完全符合规范。请注意,如果您对 getOldValue() 不感兴趣,valueChangeListener 实际上可能不是实际工作的错误工具。
  • @BalusC 我需要验证新值,我对旧值不感兴趣。还有为什么在 valueChangeListener 之前不会调用 setter?我还有哪些其他选项?
  • 验证值?为什么不使用普通的Validator?至于调用顺序,为什么要这样?一旦调用了 setter,旧值就不再可用,这违背了值更改侦听器的实际目的。
  • @Balusc 所以你建议在验证器中提供一个空检查?现在有办法防止空值,如果用户清除了该值,则将 0.0 发送到服务器而不是空值?
  • @Balusc 验证器会在 valueChangedListener 之前运行吗?我猜只有当验证通过时,它才应该调用 ValueChangedEvent ,对吧?

标签: jsf jsf-2


【解决方案1】:

我需要验证新值,我对旧值不感兴趣。

那么valueChangeListener 是错误的工作工具。使用普通的Validator。为了验证空但必填的字段,请使用required="true"。为了跳过空字段上的自定义验证器,请将以下上下文参数添加到 web.xml

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>

唯一的缺点是这也会跳过@NotNull/@NotBlank JSR303 bean 验证,但如果你不使用它应该不会有什么坏处。


还有为什么 setter 不会在 valueChangeListener 之前被调用?

因为否则旧值会丢失,这将破坏值更改侦听器的目的。


验证器会在 valueChangedListener 之前运行吗?我猜只有当验证通过时,它才应该调用 ValueChangedEvent ,对吧?

没错。仅当组件通过验证时才调用值更改侦听器(即UIInput#isValid() 返回true)。应该再次注意的是,当您对旧值不感兴趣时​​,值更改侦听器很可能是您所考虑的工作的错误工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多