Spring Rest API驗證應該在DTO還是在實體中?
阿新 • • 發佈:2022-06-01
考慮了一段時間後,我決定最好的方法是在兩層上進行驗證。我會解釋原因。
假設您有一個 User
實體和一個 name
欄位,並且您的應用程式業務邏輯要求該欄位不能為空。您還具有 UserDTO
和相同的 name
欄位。
我假設您對實體和DTO的所有驗證都將使用 java.validation
API進行。
如果僅在控制器上進行驗證,則可以確保持久儲存無效實體,但只能從傳入請求中進行。如果您擁有操縱實體的服務,則它可能會在不通知您的情況下將實體保持在無效狀態(除非對資料庫列進行了空檢查)。
然後,您可以考慮:“好吧,我將驗證註釋從DTO移到實體上,一切都會好起來的”。
如果僅在實體上進行驗證,則無論傳入請求還是服務層都不會受到影響,但是您可能會遇到效能問題。
根據 Anghel Leonard 書中的 Spring Boot永續性最佳實踐,每次從資料庫載入實體時,Hibernate都會浪費記憶體和CPU來維持實體狀態在永續性上下文中,即使實體處於“只讀模式”。
現在,考慮一下。如果使用者名稱為空,而您僅在實體上對其進行驗證,則意味著您:
- 開始交易
- 載入了實體
- 更改了實體
- 重新整理了永續性上下文
- 回滾交易
其中許多操作可能會非常昂貴,而您所做的只是將其扔到垃圾箱中,而如果您早先驗證了使用者名稱,則根本無法做任何事情。
因此,我的建議是在兩層上進行驗證。註釋使操作變得如此簡單,以至於您甚至沒有藉口不這樣做。甚至可以編寫自定義驗證器來進行復雜的驗證,然後可以在許多其他地方重複使用
此外,這是我提到的書的連結,希望您喜歡: https://www.amazon.com.br/dp/B087WS81RK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1