2013-03-13 70 views
0

我編寫了一個自定義驗證器來驗證所有表單字段。我正在使用Incefaces 3.2和JSF 2.0。我注意到整數類型的UIInput有多個問題。如果我沒有在表單中輸入任何數據並點擊提交,我可以使用myUIInput.getValue()檢查自定義驗證器中的字段值並啓動所需的驗證。UIInput的isLocalValueSet總是在自定義驗證器中返回true

當我在字段中輸入一些值並提交時,我在我的自定義驗證器中使用getSubmittedValue()來驗證它。到現在爲止還挺好。當我從UI中刪除該字段的值並將其提交後,getValue()仍然保留舊值。 isLocalValueSet()總是返回null。

我試過在第一次啓動驗證後重置下面的內容。它也沒有幫助。

 myInput.setValue(null); 
     myInput.setSubmittedValue(null); 
     myInput.setLocalValueSet(false); 

如何將我的字段狀態重置爲初始值?如何在啓動驗證後正確設置isLocalValueSet()?提前致謝。

回答

1

JSF組件按它們出現在組件樹中的順序進行驗證。鑑於您正在使用getSubmittedValue(),這隻能意味着您的自定義驗證程序在之前被觸發了任何組件都已被處理。也許你已經將驗證器附加到表單開頭的隱藏輸入中。

這意味着,當您的自定義驗證器完成後,JSF將繼續處理組件樹中的所有後續組件,從而以「常規方式」重做每個單獨組件的整個驗證過程,因此會覆蓋組件的狀態從您的自定義驗證器上操作。

我不知道具體的功能需求是什麼,爲什麼你需要接近它這樣的,這是有點臭,但你可以理論上所有組件都被處理後燒製自定義驗證解決它。並處理getValue()而不是getSubmittedValue()。再一次,具體的功能要求太不明確,無法提出任何設計改進。

+0

感謝BalusC。我們在我們的jsf2,Icefaces 3應用程序的某些形式上使用JSR 303 bean驗證。我們遇到了控制驗證順序的問題。我想刪除所有驗證,但請求對象(dto)與項目的其他類緊密耦合。我們已經接近完成項目的包裝了,如果沒有bean驗證,創建新的dto已經太遲了。所以,我寫了一個自定義驗證器,例如。 – Superman9999 2013-03-20 00:33:52

+0

每次我提交表單時都會觸發此驗證器。如果未輸入任何值,我的客戶添加了最後一分鐘的要求以顯示整數字段爲空白。如果驗證(必需或格式)失敗,它必須設置爲空白。出於某種原因,getValue()和getSubmittedValue()沒有正確更新整型字段。我沒有字符串或日期字段的問題。作爲解決方法,我在UI上使用了一個字符串,如果它是一個有效的int值,則將其更改回整數。我還沒有探索添加轉換器的路線。 – Superman9999 2013-03-20 00:34:20