標籤:

實體類的欄位的驗證應該寫在service層嗎?

例如,用戶實體類User有user_name、gender和age欄位,user_name的長度必須是2到30個字元,gender欄位只能是單字元字元串m或f,age必須是0到150的整數。

這些值最終都來源於用戶輸入,但是用戶可能會輸入非法的值,例如1000個字元的user_name或者age為-5。因此我們需要對用戶輸入的對應實體類欄位的值進行校驗。

這些值從用戶到達資料庫,一般要經過Java的controller、service、DAO(repository)等層次。大家覺得在哪一個層次對用戶輸入的這些值進行校驗比較好呢?是在controller層對用戶輸入進行驗證,還是在service層進行驗證並向controller返回驗證異常,還是在資料庫訪問層在實體類要被持久化之前驗證?

還有就是在實體類的setter里驗證,還是在實體類外的service或者controller之類的寫驗證邏輯比較好呢?


謝邀。

前台做一些基本校驗,後台也要做,建議service做,controller不做校驗只做參數格式轉換。因為service會重用,controller一般是不會的。dao大部分可以不做校驗,如果能保證都是從service調過來校驗就多餘了,dao可以挑一些重要和敏感的做校驗

校驗多的時候,一定要做好校驗代碼的封裝,否則代碼量會非常多。而且校驗的時候提示信息不知道你們是怎麼樣做國際化的,可以貼出來看看。

後面我會寫一下我們項目組的習慣和規範。歡迎關注。

我們項目目前是這樣做校驗的,供參考:xwjie/PLMCodeTemplate


前端先檢驗,然後在controller層繼續校驗防止偽造請求繞過前端,然後service層也要驗證,保證復用性。


用戶輸入的東西有問題,這誰的鍋啊,用戶的。誰和用戶打交道啊,Controller。


Controller做檢驗,service不做參數檢驗只做業務方面的檢驗


常規格式檢驗放controller,像什麼非空,各種數據格式,通用數據格式如身份證,手機格式等。

業務相關檢驗就放service了,出於復用和高內聚考量。

實體類getset方法盡量不加邏輯,原因參考阿里巴巴java開發手冊。


javaBeans驗證是Java Api提供的一種驗證應用數據的機制,允許在企業應用的任意一層使用相同的應用驗證邏輯。它可以驗證從用戶接受的輸出來完成數據的完整性,驗證約束也可以應用到持久化實體,可嵌入類和所映射的超類。javax.validation.constranints包中提供了很多內置約束規則。譬如@NotNull 欄位必須不能為空,@Pattern匹配正則表達式。


如果serivce層做檢驗,分散式系統下會造成大量不必要的數據傳輸,而且如果serivceA調用serivceB,那麼serivceA和serivceB都要對參數檢驗兩次,代碼冗餘了。建議單機項目控制層做檢驗,分散式則控制層和serivce都要做檢驗,特殊情況再特殊考慮


一般是寫在service層。寫在controller層也沒錯。我在controller層和service層都寫過。但是我覺得應該看你們公司的規範,如果大家都寫在controller層,那麼你也寫在controller層。


個人認為應該是前端驗證+service驗證,如果是有多個services都用到該實體需要驗證,最好寫個Validation類,放倒utils裡面吧,想在哪裡驗證隨時可以調用。

PS: 你們user_name這種下劃線命名法在java里算是異端吧,一般常量名才會用下劃線,變數名用駝峰。當然按照團隊的規則也無可厚非


其實還有一個facade層,還有調用鏈。。。當你新增欄位的時候就加一個檢驗類,不用修改原有代碼,我覺得這樣才是良好設計。同理dao返回的數據也一樣


建議每層都檢驗,鬼知道將來代碼會怎麼瞎雞巴改,複數校驗配合單元測試可以更大可能暴露問題。

而且封裝好限制條件,複數檢驗代碼量並不會有太大的變化。

至於性能?反正CPU閑著也是閑著。


一般來說在service層做,service層一般來說會復用的,這樣相當於你每次用service就驗證了這個欄位。


如果是一些基礎驗證,可以用spring Hibernate validation,,如果是業務驗證,一般是在controller驗證


講道理...哪層都要檢驗的...前端...controller service...

不是說你前端校驗了...你controller就可以不校驗了...service也一樣...你的service的數據開源可能不只是controller...不是說你在controller里檢驗過以後...就可以不校驗了...因為但凡是open的你就無法保證調用方一定會傳給你正確的參數


首先應該是前端驗證,然後在service驗證,建議題主看一下MVC設計模式,我覺得你的思維有點混亂


那得看你用什麼框架了,現在js,spring都有這功能


推薦閱讀:

如何學好ssh框架,spring學起來怎麼這麼難呢?
MyBatis不是完整的ORM框架?
怎麼閱讀Spring源碼?
關於spring,mybatis,mvc等等框架?
如何理解 ssh 三大框架?

TAG:MVC | Spring | JavaWeb |