Spring Boot 進行Bean Validate和Method Validate
SpringBoot在內部通過整合hibernate-validation 已經實現了JSR-349驗證規範介面,在SpringBoot專案中只要直接使用就行了。
一般用在Controller中用於驗證前端傳來的引數。
驗證分兩種:對封裝的Bean進行驗證 或者 對方法簡單引數的驗證
一、進行BeanValidate
1.定義Bean
1234567891011121314151617181920212223 | public 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" ) @ResponseBody public 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 | @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } |
2.在要MethodValidate的類上加上註解@Validated
3.在方法中使用
12345678910 | @Controller @Validated @RequestMapping ( "valid" ) public class ValidController { @RequestMapping ( "/check" ) @ResponseBody public String check( @Min (value = 2 ,message = "age必須大於2" ) int age) { return "" + age; } } |
4.處理校驗失敗
預設校驗失敗後會讓方法丟擲Unchecked Exception,在springboot中預設是會讓其跳轉到error頁面,所以只要新增一個這個異常的處理器就行:
12345678910 | @ExceptionHandler (value = { ConstraintViolationException. class }) @ResponseBody public 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層