2012-07-16 69 views
0

我有一個豐富的:tabpanel和幾個選項卡。該tabpanel的類型被設置爲'client'。在每個選項卡中,都有一些h:inputText。jsf輸入分隔驗證

我想要做的是顯示錯誤,如「Tab:Tab1 [,Tab2 [,Tab3 ...]]有錯誤,請在保存前更正錯誤。如果所有選項卡中存在錯誤。我試圖通過AjaxListener(Seam)或PhaseListener實現這一點(兩者都可以實現我想要做的)。

問題是,當有一些標記爲immediate =「true」的輸入時,首先將這些輸入與立即=「false」的那些輸入分開驗證。除非這些「直接」輸入不包含錯誤,否則「非直接」輸入不會被驗證。

有什麼辦法強制jsf驗證器驗證某些commandButton上的所有輸入?或者有什麼方法來覆蓋jsf的默認驗證器?

回答

0

在JSF中沒有「默認驗證器」,每個組件都會負責自己的轉換和驗證(如果有的話)。組件具有在JSF lifecycle的每個階段中調用的回調,並且這些回調針對組件樹中的每個組件調用驗證和轉換邏輯(因此沒有集中式轉換器或驗證器)。

immediate=false輸入組件時的處理驗證階段(第三在生命週期)執行驗證和轉換,而用immediate=true輸入組件這樣做在應用請求值相(第二生命週期中)。

A「問題」(實際上是一個設計約束)與JSF生命週期的是,無論何時在任何階段中發現錯誤,該框架直接跳到呈現響應相而不執行剩餘階段,因此,如果在immediate=true輸入中找到任何錯誤(第二階段),第三階段從不被調用。

沒有解決方法,您需要使所有輸入immediate=falseimmediate=true,以便所有驗證發生在同一階段。我建議堅持immediate=false,除非你有充分的理由不這樣做。例如,如果無論輸入的驗證狀態如何,都需要執行操作,請使用命令按鈕immediate=true