2009-09-09 125 views
1

我們的應用程序是使用Spring框架開發的。檢查所有圖層(演示文稿,業務,數據庫)中的空白條件是否是一種好的做法?在我們的應用程序的流程是不同層次的檢查(表示層,中間層,數據庫)

表單提交 - > jQuery的驗證 - >彈簧驗證 - >控制器 - >服務 - >數據庫

目前,我們正在檢查這兩個校驗器,控制器和服務層的空狀態的參數。在控制器中,服務僅在參數不爲null時調用,而在服務中如果參數爲null,則拋出IllegalArgumentException。

上述設計是否正確?是否有任何暗示這種良好做法的鏈接?

+0

退房比爾·瓦格納的書更有效的C# - 它有上限制了可空類型的「範圍」一節。他比我說得更好。 – TrueWill 2009-09-09 02:51:28

回答

3

這要看!

  • 首先,弄清楚有多少錯誤處理需要。問問你自己需要多少公共接口。這是一次性使用的代碼嗎?更正式和公開的API需要更仔細地接受和返回的數據,並且更清楚地記錄。特定於應用的代碼通常只會引發異常 - 任何異常 - 當出現問題時。選擇適當的錯誤檢查級別。 (答案可能會在不同層次或應用程序的不同模塊中有所不同)。

  • 您的jQuery驗證程序不應該處理空值,但應該檢測空字符串(顯然)。

  • 我會推薦確保Spring驗證器對您的應用程序是一個強大的「防火牆」。我會在這裏做相當嚴格的空檢查,因爲這可以消除控制器代碼的負擔。

  • 如果你有很好的驗證器,你可以編寫更細的控制器,也許根本不需要驗證。實際上不需要在驗證器中已有的控制器中進行冗餘檢查。這些在體系結構上是相同的層。

  • 雖然您在驗證程序中有檢查,但很可能服務層將以不同方式從不同控制器調用。我認爲值得放置一層保護,以保持數據庫的完整性。這段代碼不會改變數據庫,或者如果調用不正確,就會默默地繼續執行,這一點非常重要;像這樣的bug特別討厭追蹤。當調用者傳遞錯誤(和空值)時,代碼應該拋出異常 - 任何異常。當然,IllegalArgumentExceptions或NPE可能是正確的,實際上任何異常都可以解決這個問題,並允許開發人員追蹤問題。同樣,如果你正在開發一個公共API,你需要更加嚴格。

  • 如果數據庫缺少一些信息,您應該在服務層接口中定義應該發生什麼。 Hibernate有時會返回空值,並根據調用情況拋出異常。遵循它建立的模式是有意義的。

1

是否可以在不通過控制器的情況下調用服務?

如果沒有,並且在控制器中檢查了所有參數爲null,那麼在服務中檢查它是沒有意義的。

但是,如果有某種方式直接進入服務,那麼您需要檢查。