校驗(yàn)框架Hibernate Validator【原創(chuàng)】

參考書籍《Hibernate Validator--JSR 303 的參考實(shí)現(xiàn)》

為何要使用校驗(yàn)框架

大部分后端開發(fā)都非常的苦惱,明明需求不怎么難,但是因?yàn)闃I(yè)務(wù)需求的限制,許多的參數(shù)都需要校驗(yàn),比如校驗(yàn)用戶輸入的郵箱是否符合郵箱的格式,電話號(hào)是否符合某個(gè)號(hào)段,用戶名是否沒有包含特殊符號(hào)等等,可能邏輯代碼就那么多但是controller層或者service的校驗(yàn)邏輯的寫了幾百行,驗(yàn)證影響了代碼的可讀性以及代碼復(fù)用,甚至出現(xiàn)bug排查起來光看校驗(yàn)邏輯就要看半天,這是讓開發(fā)非常頭疼的事情,于是有了項(xiàng)目上的大佬們自己封裝自己的校驗(yàn)工具類,但是有的項(xiàng)目頻繁的換人,早成的情況是新來的壓根就不知道前面的人已經(jīng)造過輪子,導(dǎo)致代碼里面非常的重復(fù)輪子,遇到這種事情莫慌,咋們?cè)陧?xiàng)目里面統(tǒng)一規(guī)定有用一個(gè)校驗(yàn)框架就完事了------Hibernate Validator 一個(gè)非常強(qiáng)大的校驗(yàn)框架的

  1. 校驗(yàn)入?yún)?duì)象中的某個(gè)屬性不為空
接口controller層代碼

    public GetAndonDeviceResponse getAndonResponseDevice(@RequestBody @Validated GetAndonDeviceRequest request) {
  
    }

請(qǐng)求對(duì)象中的屬性
public class GetAndonDeviceRequest extends PagedRequest {
    private String workerNumber;
    @NotEmpty(message = "ANDON_STATUS_NOT_EMPTY")
    private String status;
    private List<Long> andonClassIds;

首先解釋下@RequestBody這個(gè)注解不是校驗(yàn)框架的,加上這個(gè)注解的原因是因?yàn)槟阈枰r?yàn)的屬性在GetAndonDeviceRequest這個(gè)對(duì)象中,而前后端分離的項(xiàng)目前端傳過來的就是json,這個(gè)注解表明的是去做返序列化,值得注意的是

@RequestBody(required = false)

這個(gè)注解中的requird默認(rèn)等于true表明的是不管如何前端的body必須穿,不傳就會(huì)造成反序列失敗,而等于false表明的意思就是body中有值就反序列化,沒有就不會(huì)做,因?yàn)槲疫@里需要校驗(yàn)對(duì)象中的屬性值,因此我這里強(qiáng)制要求前端必須傳這個(gè)body給我,因?yàn)闆]有body反序列得到的request就是一個(gè)null里面啥都沒有去做校驗(yàn)就做了

我這就在controller的接口的如請(qǐng)請(qǐng)求參數(shù)中添加了來那個(gè)注解

@RequestBody 和@Validated

在需要校驗(yàn)的對(duì)象的屬性上面添加了

@NotEmpty(message = "ANDON_STATUS_NOT_EMPTY")

notEmpt這個(gè)注解表明的是這個(gè)屬性值不能等于空或者長(zhǎng)度不能等于0
message
是當(dāng)status不符合要求的時(shí)候就需要拋出的錯(cuò)誤提示信息拋出的異常堆棧為MethodArgumentNotValidException這個(gè)錯(cuò)誤
在使用這些注解之前需要先在maven中添加依賴

 <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator</artifactId>
             <version>6.0.8.Final</version>
  </dependency>
這里的版本可以自己去選擇

這個(gè)框架的校驗(yàn)的校驗(yàn)是在這個(gè)對(duì)象生成的時(shí)候進(jìn)行校驗(yàn)的

  1. 對(duì)象圖的校驗(yàn)
    所謂對(duì)象圖就是對(duì)象里面的子對(duì)象的屬性的校驗(yàn)
public class InsertAndUpdateAndonBinRequestType extends BaseRequest {
    @Valid
    private List<AndonBinDTO> list;
}



public class AndonBinDTO {
    private String id;
    @NotEmpty(message = "bin_code_not_empty")
    private String andonBinCode;

如果我需要校驗(yàn)InsertAndUpdateAndonBinRequestType中的AndonBinDTO中的andonBinCode是否符合要求,只需要在InsertAndUpdateAndonBinRequestType的list屬性上加上一個(gè)@Valid注解,在需要校驗(yàn)的子對(duì)象的屬性上加上對(duì)應(yīng)的注解就可以了

Hibernate Validator支持兩種校驗(yàn)?zāi)J?,第一種是快速失敗模式,也是框架的默認(rèn)模式,技術(shù)當(dāng)遇到第一個(gè)需要校驗(yàn)的參數(shù)不符合要求就返回校驗(yàn)結(jié)果,第二種是返回所有的校驗(yàn)結(jié)果在拋出異常,拋出的異常是一個(gè)異常數(shù)組,這個(gè)需要配置,建議在使用過程中不要去配置,因?yàn)椤澳J(rèn)大于配置”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容