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;
總結:基本上到這裏就能滿足百分之九十五的驗證需求。