1. 程式人生 > >Spring Boot 進行Bean Validate和Method Validate

Spring Boot 進行Bean Validate和Method Validate

SpringBoot在內部通過整合hibernate-validation 已經實現了JSR-349驗證規範介面,在SpringBoot專案中只要直接使用就行了。

一般用在Controller中用於驗證前端傳來的引數。

驗證分兩種:對封裝的Bean進行驗證  或者  對方法簡單引數的驗證

一、進行BeanValidate

1.定義Bean

1234567891011121314151617181920212223public class ValidBean {@NotNull(message = "名字不能為空")private String name;@Min(value = 18, message = 
"年齡必須大於18")private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

  2.使用

123456@RequestMapping("bean")@ResponseBodypublic String say(@Valid ValidBean bean, BindingResult bindingResult){       
return bindingResult.hasErrors() ?bindingResult.getFieldError().getDefaultMessage() : "incorrect";}

3.注意
@Valid 和 BindingResult 是一一對應的,如果有多個@Valid,那麼每個@Valid後面跟著的BindingResult就是這個@Valid的驗證結果,順序不能亂

4.Api
@Null 只能是null
@NotNull 不能為null 注意用在基本型別上無效,基本型別有預設初始值
@AssertFalse 必須為false
@AssertTrue 必須是true

字串/陣列/集合檢查:(字串本身就是個陣列)
@Pattern(regexp="reg") 驗證字串滿足正則
@Size(max, min) 驗證字串、陣列、集合長度範圍
@NotEmpty 驗證字串不為空或者null
@NotBlank 驗證字串不為null或者trim()後不為空

數值檢查:同時能驗證一個字串是否是滿足限制的數字的字串
@Max 規定值得上限int
@Min 規定值得下限
@DecimalMax("10.8") 以傳入字串構建一個BigDecimal,規定值要小於這個值 
@DecimalMin 可以用來限制浮點數大小
@Digits(int1, int2) 限制一個小數,整數精度小於int1;小數部分精度小於int2
@Digits 無引數,驗證字串是否合法
@Range(min=long1,max=long2) 檢查數字是否在範圍之間
這些都包括邊界值

日期檢查:Date/Calendar
@Post 限定一個日期,日期必須是過去的日期
@Future 限定一個日期,日期必須是未來的日期

其他驗證:
@Vaild 遞迴驗證,用於物件、陣列和集合,會對物件的元素、陣列的元素進行一一校驗
@Email 用於驗證一個字串是否是一個合法的右鍵地址,空字串或null算驗證通過
@URL(protocol=,host=,port=,regexp=,flags=) 用於校驗一個字串是否是合法URL

二、進行MethodValidate

1.注入MethodValidationPostProcessor Bean

1234@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {return new MethodValidationPostProcessor();}

2.在要MethodValidate的類上加上註解@Validated
3.在方法中使用

12345678910@Controller@Validated@RequestMapping("valid")public class ValidController {@RequestMapping("/check")@ResponseBodypublic String check(@Min(value = 2,message = "age必須大於2"int age) {return "" + age;}}

4.處理校驗失敗
預設校驗失敗後會讓方法丟擲Unchecked Exception,在springboot中預設是會讓其跳轉到error頁面,所以只要新增一個這個異常的處理器就行:

12345678910@ExceptionHandler(value = { ConstraintViolationException.class })@ResponseBodypublic String handleResourceNotFoundException(ConstraintViolationException e) {Set<ConstraintViolation<?>> violations = e.getConstraintViolations();StringBuilder strBuilder = new StringBuilder();for (ConstraintViolation<?> violation : violations ) {strBuilder.append(violation.getMessage() + "\n");}return strBuilder.toString();} 

5.注意
如果使用了@Validated,那麼BeanValidate也會丟擲異常而不是之前的封裝在BindingResult中

三、自定義異常處理
用到再查,網上很多例子

四、

驗證其實基於spring AOP ,所以其實任何Spring Bean都能利用這些註解做驗證,比如Service層。但用的最多的還是Controller層