2011-10-18 62 views
0

我只是想知道在春季的數據驗證。 Spring提供了兩個(也許更多)驗證選項。第一個選擇是使用Validator接口並自行創建整個驗證。第二個選擇是使用註釋驗證(JSR 303)。春天 - 數據驗證

現在我真的很困惑:)我應該選擇哪個驗證。我需要的是檢查接收的數據對象是否正確(通過正確的方式表示所有必填字段都已填充),這可以通過JSR 303驗證或通過我自己的驗證器使用「驗證器實例」完成。但是我還需要檢查這個數據對象是否對某些數據庫約束有效(驗證者需要檢查數據庫中的某些數據,例如是具有這個ID的用戶是否註冊了......),這隻能由我自己完成驗證器。

我不知道哪種方式應該是最好的。結合兩者還是創建我自己的驗證器?

我會感謝任何意見...

更新(從評論搬遷)

好吧,我跟瑞安的例子,我覺得我是成功的。我創建了自己的Spring Validator實現,並在此Validator I @ Autowire-d javax JSR 303實例中創建。但是注射有問題。在我的配置中,這段代碼導致了一些例外,因爲spring不知道我要注入哪個Validator。所以我刪除了該代碼。

最後我還刪除了Spring Validator實現,因爲我不知道在哪裏可以獲取Errors屬性,這是「驗證」方法中的第二個參數所需的:)。我從服務層手動觸發驗證,我真的不知道,我可以在哪裏獲得Error對象。

順便說一句,我發現了另一個解決方案如何實現驗證。我想通過LocalValidatorFactoryBean擴展我的驗證器類。 LocalValidatorFactoryBean實現兩個Validator接口的類(Spring Validator + JSR 303)。但我不確定這是否是一種好方法。這種方法也需要Error對象,我不知道在哪裏可以找到/得到。

更新 Error對象來自「BindException」。

FooObjectVO myObject = new FooObjectVO(); 
BindException errors = new BindException("fooObject", myObject); 

回答

1

它們並不是真正獨立的選項 - 更像是兩種可用的驗證實現。由於Spring的JSR 303支持also implements its own Validator interface,所以你不必選擇其中的一個。您可以以任何方式混合和匹配實現,以最簡單的方式完成工作。

+0

我不確定我是否理解你的權利。你是否提到通過實現Validator接口將兩個實現合併爲一個?或者你是指創建我自己的註釋約束?如果我的評論有點愚蠢,我很抱歉,但我在春季驗證新手(好,春天)。請問,你能否給我提供一個小例子或小指南,如何結合JSR 303和我自己的驗證? – Peter

+0

那麼,一種方法是編寫自己的Spring的'Validator'接口實現,並將其注入Spring的JSR 303'Validator'實例。然後調用JSR 303驗證器進行基本字段驗證,然後執行您自己的自定義驗證。 –

+0

@Peter:當您對問題(或新問題)進行更新時,不應將其發佈在評論中。我已將您的更新移到您的問題上,並將您的評論標記爲刪除。 –

0

在這種情況下,我寧願將兩者結合起來。我喜歡儘可能使用JSR 303驗證。我用我自己的驗證器補充它。