Java Validation方法入?yún)⑿r瀸崿F(xiàn)過程解析
一.前言
在日常的開發(fā)中,經(jīng)常需要對方法參數(shù)進行校驗(非空、長度等)。如果采用hardcode去校驗(if..else..),會造成代碼冗余,復(fù)用性低,導(dǎo)致維護成本比較高。借助Validation組件,可以很方便地通過注解來校驗參數(shù)。
二.Java Validation組件
JSR
JSR 是一種規(guī)范標準,規(guī)定了一些校驗規(guī)范的注解,位于javax.validation.constraints包下,只提供規(guī)范不提供實現(xiàn),如@NotNull,@Size 等
Hibernate Validation
hibernate Validation 與 hibernate ORM框架沒有半毛錢關(guān)系,它提供了JSR的實現(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>
手動添加bean :
對實體類添加注解:
@Data
publicclassPeople {
@NotNull(message = "姓名不能為空")
privateStringname;
@Min(value = 1, message = "年齡不能小于1歲")
privateInteger size;
}
Controller層上用法:
如果在Spring的Controller層引用以上Java Bean對象,則需要加上@Valid注解,用法如下:
@RestController
@RequestMapping("/api")
publicclassPeopleController {
@Autowired
privatePeopleService peopleService;
@RequestMapping("/addPeople")
publicStringaddPeople(@Valid@RequestBodyPeople people) {
peopleService.addPeople(people);
return"ok";
}
}
Service層上用法:
@Valid注解,當我們用Service接口層的時候,會發(fā)現(xiàn)參數(shù)校驗邏輯是不生效的。要向讓@Valid注解在controller層以外的地方生效,必須配合@Validated來使用。這是因為Spring給我們創(chuàng)建了一個用于參數(shù)校驗的AOP切面邏輯,過濾方式就是class被@Validated修飾的bean對象。所以我們可以使用@Validated來修飾我們的service層實現(xiàn)類:
@Validated
public interface PeopleService {
voidaddPeople(@ValidPeople people);
}
Controller層不需要@Validated注解是因為在Spring的controller層有數(shù)據(jù)綁定和校驗的過程,默認就會對@Valid修飾的方法參數(shù)使用Validator來做校驗邏輯。
四.原理
1.利用Spring ioc,注入MethodValidationPostProcessor和LocalValidatorFactoryBean。
2.利用Spring ioc提供的擴展點(BeanPostProcessor, InitializingBean),初始化攔截器MethodValidationInterceptor
3.MethodValidationPostProcessor用來生成和植入攔截器MethodValidationInterceptor,調(diào)用方法時自動攔截。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot利用@Aspect實現(xiàn)日志工具類的詳細代碼
這篇文章主要介紹了springboot利用@Aspect實現(xiàn)日志工具類,通過實例代碼介紹了導(dǎo)包及在啟動類上進行注解自動掃描的方法,需要的朋友可以參考下2022-03-03
springboot+thymeleaf+shiro標簽的實例
這篇文章主要介紹了springboot+thymeleaf+shiro標簽的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Java并發(fā)編程示例(六):等待線程執(zhí)行終止
這篇文章主要介紹了Java并發(fā)編程示例(六):等待線程執(zhí)行終止,在本節(jié),示例程序演示等待初始化方法完成后,再去執(zhí)行其他任務(wù),需要的朋友可以參考下2014-12-12

