1. 程式人生 > 其它 >Spring Rest API驗證應該在DTO還是在實體中?

Spring Rest API驗證應該在DTO還是在實體中?

       考慮了一段時間後,我決定最好的方法是在兩層上進行驗證。我會解釋原因。

假設您有一個 User 實體和一個 name 欄位,並且您的應用程式業務邏輯要求該欄位不能為空。您還具有 UserDTO 和相同的 name 欄位。

我假設您對實體和DTO的所有驗證都將使用 java.validation API進行。

如果僅在控制器上進行驗證,則可以確保持久儲存無效實體,但只能從傳入請求中進行。如果您擁有操縱實體的服務,則它可能會在不通知您的情況下將實體保持在無效狀態(除非對資料庫列進行了空檢查)。

       然後,您可以考慮:“好吧,我將驗證註釋從DTO移到實體上,一切都會好起來的”。

。好,是的,不是!

如果僅在實體上進行驗證,則無論傳入請求還是服務層都不會受到影響,但是您可能會遇到效能問題。

根據 Anghel Leonard 書中的 Spring Boot永續性最佳實踐,每次從資料庫載入實體時,Hibernate都會浪費記憶體和CPU來維持實體狀態在永續性上下文中,即使實體處於“只讀模式”。

現在,考慮一下。如果使用者名稱為空,而您僅在實體上對其進行驗證,則意味著您:

  1. 開始交易
  2. 載入了實體
  3. 更改了實體
  4. 重新整理了永續性上下文
  5. 回滾交易

       其中許多操作可能會非常昂貴,而您所做的只是將其扔到垃圾箱中,而如果您早先驗證了使用者名稱,則根本無法做任何事情。

因此,我的建議是在兩層上進行驗證。註釋使操作變得如此簡單,以至於您甚至沒有藉口不這樣做。甚至可以編寫自定義驗證器來進行復雜的驗證,然後可以在許多其他地方重複使用

此外,這是我提到的書的連結,希望您喜歡: https://www.amazon.com.br/dp/B087WS81RK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1