2013-02-06 30 views
1

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

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

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

+0

什么是功能要求?你为什么要防止这个?这是完全预期的行为。至于调用顺序,这也完全按照规范。请注意,如果您对'getOldValue()'不感兴趣,'valueChangeListener'实际上可能是实际工作的错误工具。 – BalusC

+0

@BalusC我需要验证新值,我对旧值不感兴趣。另外为什么在二进制文件不会被调用之前,valueChangeListener?我还有什么其他选择? – Geek

+0

验证值?你为什么不使用普通的'Validator'?至于调用顺序,为什么它应该是?一旦调用者被调用,旧的值就不再可用,并且这改变了值更改监听器的实际目的。 – BalusC

回答

1

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

A valueChangeListener然后是工作的错误工具。使用正常的Validator。为了验证空的但是必填的字段,请使用required="true"。为了跳过空字段自定义验证,下面的上下文PARAM添加到web.xml

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

唯一的缺点是,这也将跳过@NotNull/@NotBlank JSR303 Bean验证,但如果你AREN不应损害无论如何都不会使用它。


也是为什么制定者将不会在valueChangeListener之前叫什么?

因为旧值会以其他方式丢失,这会破坏值更改侦听器的用途。


将验证程序valueChangedListener之前运行?我猜只有当验证通过时,它应该调用一个ValueChangedEvent,对吧?

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