一、Spring中的校驗注解
在spring的使用過程中,有一些現(xiàn)成的注解可以使用
| Constraint | 詳細(xì)信息 |
|---|---|
| @AssertFalse | 該值必須為False |
| @AssertTrue | 該值必須為True |
| @DecimalMax(value,inclusive) | 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值 ,inclusive表示是否包含該值 |
| @DecimalMin(value,inclusive) | 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值 ,inclusive表示是否包含該值 |
| @Digits | 限制必須為一個小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction |
| 該值必須為郵箱格式 | |
| @Future | 被注釋的元素必須是一個將來的日期 |
| @FutureOrPresent | 被注釋的元素必須是一個現(xiàn)在或?qū)淼娜掌?/td> |
| @Max(value) | 被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值 |
| @Min(value) | 被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值 |
| @Negative | 該值必須小于0 |
| @NegativeOrZero | 該值必須小于等于0 |
| @NotBlank | 該值不為空字符串,例如“ ” |
| @NotEmpty | 該值不為空字符串 |
| @NotNull | 該值不為Null |
| @Null | 該值必須為Null |
| @Past | 被注釋的元素必須是一個過去的日期 |
| @PastOrPresent | 被注釋的元素必須是一個過去或現(xiàn)在的日期 |
| @Pattern(regexp) | 匹配正則 |
| @Positive | 該值必須大于0 |
| @PositiveOrZero | 該值必須大于等于0 |
| @Size(min,max) | 數(shù)組大小必須在[min,max]這個區(qū)間 |
二、自定義注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {MobileNoValidator.class}
)
public @interface MobileNo {
String message() default "手機號格式不正確";
boolean nullable() default false;
boolean blankable() default false;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
該自定義注解類中用到了四種元注解,最后一個注解@Constraint表示校驗此注解的校驗器類,可以多個。值得一提的是除了自定義的message、nullable和blankable屬性外,下面的groups和payload也是必須添加的。
三、注解校驗類
public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {
private boolean nullable;
private boolean blankable;
private String message;
public MobileNoValidator() {
}
@Override
public void initialize(MobileNo constraintAnnotation) {
this.nullable = constraintAnnotation.nullable();
this.message = constraintAnnotation.message();
this.blankable = constraintAnnotation.blankable();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
if (!this.nullable) {
//禁止默認(rèn)消息返回
context.disableDefaultConstraintViolation();
//自定義返回消息
context.buildConstraintViolationWithTemplate("手機號不能為空").addConstraintViolation();
return false;
} else {
return true;
}
} else if (value.length() == 0) {
if (!this.blankable) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("手機號不能為空白").addConstraintViolation();
return false;
} else {
return true;
}
} else if (!AppUtils.isMobile(value)) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate((String)StringUtils.defaultIfBlank(this.message, "手機號格式不對")).addConstraintViolation();
return false;
} else {
return true;
}
}
}
該接口使用了泛型,第一個參數(shù)是自定義注解類,第二個是要校驗的數(shù)據(jù)類型。
重寫的兩個方法,initialize為初始化方法,可以在里面做一些初始化操作,isValid方法寫我們自定義的校驗邏輯