1. 程式人生 > >SpringBoot 的 Validator 的註解校驗

SpringBoot 的 Validator 的註解校驗

@null           驗證物件是否為空
@notnull     驗證物件是否為非空
@asserttrue       驗證 boolean 物件是否為 true
@assertfalse      驗證 boolean 物件是否為 false
@min           驗證 number 和 string 物件是否大等於指定的值
@max           驗證 number 和 string 物件是否小等於指定的值
@decimalmin    驗證 number 和 string 物件是否大等於指定的值,小數存在精度
@decimalmax    驗證 number 和 string 物件是否小等於指定的值,小數存在精度
@size           驗證物件(array,collection,map,string)長度是否在給定的範圍之內
@digits       驗證 number 和 string 的構成是否合法
@past           驗證 date 和 calendar 物件是否在當前時間之前
@future       驗證 date 和 calendar 物件是否在當前時間之後
@pattern     驗證 string 物件是否符合正則表示式的規則
@Email     驗證郵箱

實際例子:
@size (min=3, max=20, message="使用者名稱長度只能在3-20之間")
@size (min=6, max=20, message="密碼長度只能在6-20之間")
@pattern (regexp="[a-za-z0-9._%+-][email protected][a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="郵件格式錯誤")
@Length(min = 5, max = 20, message = "使用者名稱長度必須位於5到20之間")  
@Email(message = "比如輸入正確的郵箱")  
@NotNull(message = "使用者名稱稱不能為空") 
@Max(value = 100, message = "年齡不能大於100歲") 
@Min(value= 18 ,message= "必須年滿18歲!" )  
@AssertTrue(message = "bln4 must is true")
@AssertFalse(message = "blnf must is falase")
@DecimalMax(value="100",message="decim最大值是100")
@DecimalMin(value="100",message="decim最小值是100")
@NotNull(message = "身份證不能為空") 
@Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份證格式錯誤")
 

 

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

一、進行BeanValidate

1.定義Bean

 
  1. 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.使用

 
  1. @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

 
  1. @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor() {
            return new MethodValidationPostProcessor();
        }

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

 
  1.       @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頁面,所以只要新增一個這個異常的處理器就行:

 
  1. @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中

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