Java Validation方法入?yún)⑿r?yàn)實(shí)現(xiàn)過程解析
一.前言
在日常的開發(fā)中,經(jīng)常需要對(duì)方法參數(shù)進(jìn)行校驗(yàn)(非空、長(zhǎng)度等)。如果采用hardcode去校驗(yàn)(if..else..),會(huì)造成代碼冗余,復(fù)用性低,導(dǎo)致維護(hù)成本比較高。借助Validation組件,可以很方便地通過注解來校驗(yàn)參數(shù)。
二.Java Validation組件
JSR
JSR 是一種規(guī)范標(biāo)準(zhǔn),規(guī)定了一些校驗(yàn)規(guī)范的注解,位于javax.validation.constraints包下,只提供規(guī)范不提供實(shí)現(xiàn),如@NotNull,@Size 等
Hibernate Validation
hibernate Validation 與 hibernate ORM框架沒有半毛錢關(guān)系,它提供了JSR的實(shí)現(xiàn),位于org.hibernate.validator.constraints包下。
三.用法
引入依賴:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
手動(dòng)添加bean :
對(duì)實(shí)體類添加注解:
@Data publicclassPeople { @NotNull(message = "姓名不能為空") privateStringname; @Min(value = 1, message = "年齡不能小于1歲") privateInteger size; }
Controller層上用法:
如果在Spring的Controller層引用以上Java Bean對(duì)象,則需要加上@Valid注解,用法如下:
@RestController @RequestMapping("/api") publicclassPeopleController { @Autowired privatePeopleService peopleService; @RequestMapping("/addPeople") publicStringaddPeople(@Valid@RequestBodyPeople people) { peopleService.addPeople(people); return"ok"; } }
Service層上用法:
@Valid注解,當(dāng)我們用Service接口層的時(shí)候,會(huì)發(fā)現(xiàn)參數(shù)校驗(yàn)邏輯是不生效的。要向讓@Valid注解在controller層以外的地方生效,必須配合@Validated來使用。這是因?yàn)镾pring給我們創(chuàng)建了一個(gè)用于參數(shù)校驗(yàn)的AOP切面邏輯,過濾方式就是class被@Validated修飾的bean對(duì)象。所以我們可以使用@Validated來修飾我們的service層實(shí)現(xiàn)類:
@Validated public interface PeopleService { voidaddPeople(@ValidPeople people); }
Controller層不需要@Validated注解是因?yàn)樵赟pring的controller層有數(shù)據(jù)綁定和校驗(yàn)的過程,默認(rèn)就會(huì)對(duì)@Valid修飾的方法參數(shù)使用Validator來做校驗(yàn)邏輯。
四.原理
1.利用Spring ioc,注入MethodValidationPostProcessor和LocalValidatorFactoryBean。
2.利用Spring ioc提供的擴(kuò)展點(diǎn)(BeanPostProcessor, InitializingBean),初始化攔截器MethodValidationInterceptor
3.MethodValidationPostProcessor用來生成和植入攔截器MethodValidationInterceptor,調(diào)用方法時(shí)自動(dòng)攔截。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java BufferedReader相關(guān)源碼實(shí)例分析
這篇文章主要介紹了Java BufferedReader相關(guān)源碼實(shí)例分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Spring MVC 中獲取session的幾種方法(小結(jié))
這篇文章主要介紹了Spring MVC 中獲取session的幾種方法(小結(jié)),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09MyBatis-Plus中使用EntityWrappe進(jìn)行列表數(shù)據(jù)倒序設(shè)置方式
這篇文章主要介紹了MyBatis-Plus中使用EntityWrappe進(jìn)行列表數(shù)據(jù)倒序設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java尋找迷宮路徑的簡(jiǎn)單實(shí)現(xiàn)示例
這篇文章主要介紹了java尋找迷宮路徑的簡(jiǎn)單實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java導(dǎo)出Excel統(tǒng)計(jì)報(bào)表合并單元格的方法詳解
我們?cè)谌粘>幊踢^程中,總是會(huì)碰見導(dǎo)出相關(guān)表格信息的需求,所以就讓我們一起來學(xué)習(xí)一下,這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel統(tǒng)計(jì)報(bào)表合并單元格的相關(guān)資料,需要的朋友可以參考下2021-10-10詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南
這篇文章主要介紹了詳解Spring-Cloud2.0之Feign調(diào)用遠(yuǎn)程服務(wù)指南,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01