Springboot之分組驗證以及自定義參數驗證

springboot之前端參數驗證
學習完簡單的驗證之後發現基本能滿足百分之80的驗證需求,接下來深入學習下驗證。

分組驗證

分組驗證需要使用到@Validated 這個註解,是spring基於@Valid註解新增的功能。所以基本上在controller層接收參數的時候,可以用@Validated註解替換@Valid。不過@Validated註解不能放在類中的字段上面,而@Valid註解可以放在類中的字段上面。所以如果類中的某個字段不是基礎類型,但是裏面的參數需要校驗的話,需要在字段上面加上@Valid 代碼如下:

/**
 * @author 海加爾金鷹
 */
@Data
public class TestVo {

    @NotBlank(message = "name 不能爲空字符串")
    private String name;

    @Valid
    private List<TestVo> testVos;  //驗證集合裏面的TestVo ,不加上無法進行驗證

分組驗證:例如同一個參數,在新增的時候,id不傳 但是在修改的時候必傳。這個時候可以利用group來指定驗證的規則組
創建兩個不同的驗證組: 關於是否繼承默認驗證組,建議都繼承,如果不繼承,在驗證的時候只會驗證指定的字段

/**
 * @author 海加爾金鷹
 * 新增驗證組
 */
public interface Insert {
}
/**
 * @author 海加爾金鷹
 *更新驗證組
 */
public interface Update extends Default {
}

設置實體的驗證規則

@Data
public class TestVo {

    @NotNull(message = "id 不能爲空", groups = Update.class)
    @Null(message = "id必須爲空", groups = Insert.class)
    private Integer id;

    @NotBlank(message = "name 不能爲空字符串")
    private String name;
}

在controller進行驗證規則設置

   @GetMapping("/id")
    public TestVo getTestVo(@RequestBody  @Validated({Update.class})   TestVo vo, BindingResult bindingResult) {
    //@Validated({Update.class}) 表示只驗證Update這個組。由於這個組繼承了默認default組 name也可以被驗證,如果是Insert 就無法驗證。
    //如果不配置{Update.class} 表示驗證默認組的數據
        return vo;
    }

最後發送請求進行驗證即可。

自定義驗證

當自己的驗證規則比較奇特的時候,可以自定義驗證

第一步: 創建自定義驗證註解

/**
 * @author 海加爾金鷹
 * 注意@Constraint(validatedBy = PhoneValidator.class) 這個註解 表明具體驗證規則在PhoneValidator類裏面
 */
@Constraint(validatedBy = PhoneValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Phone {
    String message() default "手機號格式不合法";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

第二步創建具體驗證PhoneValidator類

/**
 * @author 海加爾金鷹
 * @date 2020/5/11 17:52
 * @apiNote 手機號碼驗證
 */
public class PhoneValidator implements ConstraintValidator<Phone,String> {
    private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}");
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if(s!=null){
            return pattern.matcher(s).matches();
        }
        return true;
    }
}   

第三步:和其他的驗證註解一樣使用即可

 @Phone
    private String phone;

總結:基本上到這裏就能滿足百分之九十五的驗證需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章