@Valid和@Validated的總結(jié)區(qū)分

1. @Valid:

@Valid注解用于校驗(yàn)爪幻,所屬包為:javax.validation.Valid。

① 首先需要在實(shí)體類的相應(yīng)字段上添加用于充當(dāng)校驗(yàn)條件的注解,如:@Min,如下代碼(age屬于Girl類中的屬性):

@Min(value = 18,message = "未成年禁止入內(nèi)")  
private Integer age; 

② 其次在controller層的方法的要校驗(yàn)的參數(shù)上添加@Valid注解,并且需要傳入BindingResult對(duì)象,用于獲取校驗(yàn)失敗情況下的反饋信息憔辫,如下代碼:


@PostMapping("/girls")  
public Girl addGirl(@Valid Girl girl, BindingResult bindingResult) {  
    if(bindingResult.hasErrors()){  
        System.out.println(bindingResult.getFieldError().getDefaultMessage());  
        return null;  
    }  
    return girlResposity.save(girl);  
} 

bindingResult.getFieldError.getDefaultMessage()用于獲取相應(yīng)字段上添加的message中的內(nèi)容,如:@Min注解中message屬性的內(nèi)容(注: 通常不在這里處理異常, 由統(tǒng)一的exceptioin全局異常處理)

2. @Validated:

@Valid是javax.validation里的决侈。

@Validated是@Valid 的一次封裝螺垢,是Spring提供的校驗(yàn)機(jī)制使用。@Valid不提供分組功能

@Validated的特殊用法

2.1 分組

當(dāng)一個(gè)實(shí)體類需要多種驗(yàn)證方式時(shí)赖歌,例:對(duì)于一個(gè)實(shí)體類的id來(lái)說(shuō)枉圃,新增的時(shí)候是不需要的,對(duì)于更新時(shí)是必須的庐冯。

可以通過(guò)groups對(duì)驗(yàn)證進(jìn)行分組

分組接口類(通過(guò)向groups分配不同類的class對(duì)象孽亲,達(dá)到分組目的):


package com.valid.interfaces;  
  
public interface First {  
  
} 

實(shí)體類:


package com.valid.pojo;  
  
import javax.validation.constraints.Size;  
import org.hibernate.validator.constraints.NotEmpty;  
  
import com.valid.interfaces.First;  
  
public class People {  
      
    //在First分組時(shí),判斷不能為空  
    @NotEmpty(groups={First.class})  
    private String id;  
      
    //name字段不為空展父,且長(zhǎng)度在3-8之間  
    @NotEmpty  
    @Size(min=3,max=8)  
    private String name;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
}

注:

(1)不分配groups返劲,默認(rèn)每次都要進(jìn)行驗(yàn)證

(2)對(duì)一個(gè)參數(shù)需要多種驗(yàn)證方式時(shí),也可通過(guò)分配不同的組達(dá)到目的栖茉。例:

@NotEmpty(groups={First.class})  
@Size(min=3,max=8,groups={Second.class})  
private String name; 

控制類:

package com.valid.controller;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.validation.BindingResult;  
import org.springframework.validation.annotation.Validated;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.ResponseBody;  
  
import com.valid.interfaces.First;  
import com.valid.pojo.People;  
  
@Controller  
public class FirstController {  
      
    @RequestMapping("/addPeople")  
    //不需驗(yàn)證ID  
    public @ResponseBody String addPeople(@Validated People p,BindingResult result)  
    {  
        System.out.println("people's ID:" + p.getId());  
        if(result.hasErrors())  
        {  
            return "0";  
        }  
        return "1";  
    }  
      
    @RequestMapping("/updatePeople")  
    //需要驗(yàn)證ID  
    public @ResponseBody String updatePeople(@Validated({First.class}) People p,BindingResult result)  
    {  
        System.out.println("people's ID:" + p.getId());  
        if(result.hasErrors())  
        {  
            return "0";  
        }  
        return "1";  
    }  
} 

注:
@Validated沒(méi)有添加groups屬性時(shí)篮绿,默認(rèn)驗(yàn)證沒(méi)有分組的驗(yàn)證屬性,如該例子:People的name屬性吕漂。

@Validated沒(méi)有添加groups屬性時(shí)亲配,所有參數(shù)的驗(yàn)證類型都有分組(即本例中People的name的@NotEmpty、@Size都添加groups屬性)惶凝,則不驗(yàn)證任何參數(shù)

2.2 組序列

默認(rèn)情況下吼虎,不同組別的約束驗(yàn)證是無(wú)序的,然而在某些情況下苍鲜,約束驗(yàn)證的順序卻很重要思灰。

例:

(1)第二個(gè)組中的約束驗(yàn)證依賴于一個(gè)穩(wěn)定狀態(tài)來(lái)運(yùn)行,而這個(gè)穩(wěn)定狀態(tài)是由第一個(gè)組來(lái)進(jìn)行驗(yàn)證的混滔。

(2)某個(gè)組的驗(yàn)證比較耗時(shí)洒疚,CPU 和內(nèi)存的使用率相對(duì)比較大歹颓,最優(yōu)的選擇是將其放在最后進(jìn)行驗(yàn)證。因此拳亿,在進(jìn)行組驗(yàn)證的時(shí)候尚需提供一種有序的驗(yàn)證方式晴股,這就提出了組序列的概念愿伴。
一個(gè)組可以定義為其他組的序列肺魁,使用它進(jìn)行驗(yàn)證的時(shí)候必須符合該序列規(guī)定的順序。在使用組序列驗(yàn)證的時(shí)候隔节,如果序列前邊的組驗(yàn)證失敗鹅经,則后面的組將不再給予驗(yàn)證。

分組接口類 (通過(guò)@GroupSequence注解對(duì)組進(jìn)行排序):

package com.valid.interfaces;  
  
public interface First {  
  
}
package com.valid.interfaces;  
  
public interface Second {  
  
}  

package com.valid.interfaces;  
  
import javax.validation.GroupSequence;  
  
@GroupSequence({First.class,Second.class})  
public interface Group {  
  
}

實(shí)體類:


package com.valid.pojo;  
  
import javax.validation.constraints.Size;  
import org.hibernate.validator.constraints.NotEmpty;  
  
import com.valid.interfaces.First;  
import com.valid.interfaces.Second;  
  
public class People {  
      
    //在First分組時(shí)怎诫,判斷不能為空  
    @NotEmpty(groups={First.class})  
    private String id;  
      
    //name字段不為空瘾晃,且長(zhǎng)度在3-8之間  
    @NotEmpty(groups={First.class})  
    @Size(min=3,max=8,groups={Second.class})  
    private String name;  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
} 

控制類:

package com.valid.controller;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.validation.BindingResult;  
import org.springframework.validation.annotation.Validated;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.ResponseBody;  
  
import com.valid.interfaces.Group;  
import com.valid.pojo.People;  
import com.valid.pojo.Person;  
  
@Controller  
public class FirstController {  
      
    @RequestMapping("/addPeople")  
    //不需驗(yàn)證ID  
    public @ResponseBody String addPeople(@Validated({Group.class}) People p,BindingResult result)  
    {  
        if(result.hasErrors())  
        {  
            return "0";  
        }  
        return "1";  
    }  
}

2.3 驗(yàn)證多個(gè)對(duì)象

一個(gè)功能方法上處理多個(gè)模型對(duì)象時(shí),需添加多個(gè)驗(yàn)證結(jié)果對(duì)象

package com.valid.controller;  
  
import org.springframework.stereotype.Controller;  
import org.springframework.validation.BindingResult;  
import org.springframework.validation.annotation.Validated;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.ResponseBody;  
  
import com.valid.pojo.People;  
import com.valid.pojo.Person;  
  
@Controller  
public class FirstController {  
      
    @RequestMapping("/addPeople")  
    public @ResponseBody String addPeople(@Validated People p,BindingResult result,@Validated Person p2,BindingResult result2)  
    {  
        if(result.hasErrors())  
        {  
            return "0";  
        }  
        if(result2.hasErrors())  
        {  
            return "-1";  
        }  
        return "1";  
    }  
} 

相關(guān)文章:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幻妓,一起剝皮案震驚了整個(gè)濱河市蹦误,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肉津,老刑警劉巖强胰,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妹沙,居然都是意外死亡偶洋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門距糖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玄窝,“玉大人,你說(shuō)我怎么就攤上這事悍引《髦” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵趣斤,是天一觀的道長(zhǎng)俩块。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唬渗,這世上最難降的妖魔是什么典阵? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮镊逝,結(jié)果婚禮上壮啊,老公的妹妹穿的比我還像新娘。我一直安慰自己撑蒜,他們只是感情好歹啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布玄渗。 她就那樣靜靜地躺著,像睡著了一般狸眼。 火紅的嫁衣襯著肌膚如雪藤树。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天拓萌,我揣著相機(jī)與錄音岁钓,去河邊找鬼。 笑死微王,一個(gè)胖子當(dāng)著我的面吹牛屡限,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炕倘,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼钧大,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了罩旋?” 一聲冷哼從身側(cè)響起啊央,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涨醋,沒(méi)想到半個(gè)月后瓜饥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡东帅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年压固,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靠闭。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帐我,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愧膀,到底是詐尸還是另有隱情拦键,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布檩淋,位于F島的核電站芬为,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蟀悦。R本人自食惡果不足惜媚朦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望日戈。 院中可真熱鬧询张,春花似錦、人聲如沸浙炼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜗帜,卻和暖如春恋拷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厅缺。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蔬顾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人店归。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓阎抒,卻偏偏與公主長(zhǎng)得像酪我,于是被迫代替她去往敵國(guó)和親消痛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容