2012-06-12 35 views
0

我有一個Play 2.0.1應用程序,並且剛剛通過彈簧數據聯編程序獲取表單處理的掛起,如described in the documentation。我的地方,我哈瓦形式,比方說,一個用戶發送消息給其他用戶,看起來像這樣的地步:我應該通過JSR 303/Bean驗證處理多少邏輯?

public class MessageForm { 

    @NotNull @NotEmpty 
    public String message; 

    @NotNull 
    public User recipient; 

    // i know, no sender 
} 

我定製綁定可以確保用戶,這是由他的身份證在代表HTML表單會正確序列化,並且在沒有這樣的用戶存在時默認爲空。

我正在考慮編寫額外的驗證,即i.E.確保用戶通過表單傳遞的信息是用戶試圖發佈信息的朋友。這基本上是一種@FriendsWithCurrentUser - 註釋。

我知道如何做到這一點,我的問題是:這是個好主意嗎?從模塊的角度來看,這將是一個有點扎根於Web上下文的約束,所以我不想把它放在我的模型 - 包中。我有模糊的感覺,這可能不是JSR的意義,但我也認爲這會大大減少我的控制器中的邏輯,並允許我重用類似的用戶提交約束。

回答

1

這是常見的問題。另一個類似的情況是必須與數據庫交談的驗證。

從我的角度來看,問題是您多久會使用一次驗證?如果它將在20個地方使用,我會寫註釋+驗證器類,但如果在一個或兩個地方使用此驗證,則最好手動拋出ConstraintViolationException。然後我們仍然使用通用的驗證機制,但我們不需要編寫可疑的驗證器類。有時候這也是性能問題:我們只是爲了驗證而查詢數據庫,而且這種查詢經常在商業邏輯中重複。

權衡是從碼相對於驗證器,其混合的各種應用層的其餘部分具有良好分離驗證之間。

平時我比較喜歡,因爲經常會出現相同的驗證已經在別處用來編寫單獨的驗證。如果沒有獨立的驗證,我經常重複現有的驗證碼,因爲總有一些東西做的,然後重構驗證更重要......

Bean驗證的想法是在應用單獨的層,負責驗證。該層不應該與模型混合使用,因爲給定的模型可以通過許多不同的方式進行驗證。

可能有一個模型和各種成套驗證的 - 註釋只是配置。有時,如果要將Model用於各種產品,最好放棄註釋並使用基於XML的配置(這很容易理解和使用)。

所以不要把驗證的模型包,爲你的校驗創建一個新的包,如果你想要去的方式。