2011-06-06 64 views
2

這是對我的問題Spring Web MVC - validate individual request params的後續。在哪裏驗證網絡應用程序中的數據(使用Spring)

我已經想出瞭如何在從我的輸入創建的域對象上調用Spring驗證器,以及如何讓該驗證器對我的類自己頒發JSR-303註釋。我無法弄清楚的部分是在我的代碼中執行此驗證的地方。顯而易見的方法是在控制器中執行此操作,並在驗證失敗時返回不同的模型和視圖。

但我也有一個服務層,它有時會從Web控制器以外的輸入源中創建/更新對象。所以很容易在那裏實現驗證,但我認爲報告失敗的唯一明顯方式是拋出異常。我看到Spring提供了BindException,但Javadoc也基本上說不在應用程序代碼中使用它。

這裏常見的/推薦的做法是什麼?

回答

1

當您將驗證邏輯封裝在ValidationService中時,您可以在控制器和服務中使用它。由於您希望用戶與輸入交互並糾正無效信息,因此您應該能夠在Web視圖中顯示驗證問題。

有時你可能有數據(CommandObjects,Forms),它不能直接在服務層中看到,然後驗證應該在控制器中完成,然後控制器將信息傳遞到服務層。

當你設計你的應用程序時,你應該考慮每一層之間的交互。將驗證邏輯混合到每個層可能不是必需的。考慮數據如何進入你的系統。如果控制器是您的主要入口點,那麼您可以完全將其放置在那裏,因爲沒有數據在未通過驗證的情況下進入服務。

6

我認爲答案是兩個。

控制器與視圖相關聯。如果您更改視圖技術,您不希望驗證消失。

服務應該假設沒有人安全並驗證所有傳入參數。

+0

不夠公平。但在那種情況下,是否有一種乾淨的方式來報告失敗? – Dan 2011-06-06 15:07:51

+0

向誰報告?網絡用戶?控制器這樣做。應用服務器?該服務應該在日誌或警報或其他內容中執行此操作。我假設這個異常不會傳播出控制器。 – duffymo 2011-06-06 15:59:52

0

至少應該在服務層驗證輸入,以保證正確性。此外,如果需要,您可以進一步進行驗證以獲得更好的可用性等。

1

其他的答案都是很好的,我只是陳述一個重要的規則:

每個子系統/層應驗證其輸入,不管它來自何方。

相關問題