2013-02-06 29 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)。值得注意的是,當你對舊價值不感興趣時​​,價值變化傾聽者很可能是你心目中工作的錯誤工具。