如何防止null值作为ValueChanged事件的新值?

时间:2013-02-06 13:51:30

标签: jsf jsf-2

在输入类型字段中,我有一个值绑定到我的jsp中foo属性的double类型的变量(允许调用value)。我为foo设置了一个setter和一个getter,并且还为此输入注册了ValueChangedListener。该字段的autosubmit属性设置为true。当用户清除输入并导航到下一个字段时,valueChangedListener中的代码将被调用,newValue的{​​{1}}将变为空。我怎么能阻止这个?

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

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

1 个答案:

答案 0 :(得分: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验证,但如果你还没有使用它,那不应该受到伤害。


  

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

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


  

验证器会在valueChangedListener之前运行吗?我想只有在验证通过时才会调用ValueChangedEvent,对吗?

这是对的。仅当组件通过验证时才调用值更改侦听器(即UIInput#isValid()返回true)。值得注意的是,当你对旧价值不感兴趣时​​,价值变化倾听者很可能是你想到的工作的错误工具。