直接上干活
import com.free.common.annotation.validator.PhoneValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 自定义手机号验证
*
*/
@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 {};
}
import com.free.common.annotation.Phone;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**
* 自定义手机号验证实现
*/
public class PhoneValidator implements ConstraintValidator<Phone, String> {
private Pattern pattern = Pattern.compile("^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\\d{8}$");
@Override
public void initialize(Phone phone) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
boolean matches = true;
if (StringUtils.isNotBlank(value)) {
matches = pattern.matcher(value).matches();
}
return matches;
}
}
@Documented
是元注解,可以修饰其他注解,可以修饰其他注解,如果一注解没有被@Documented修饰,最终生成的文档中不会带此注解
@Retention(RetentionPolicy.RUNTIME)
被它所注解的注解保留多久,一共有三种策略
runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认生命周期
source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
@Target
被这个 @Target 注解修饰的注解将只能作用在成员字段上,不能用于修饰方法或者类。其中,ElementType 是一个枚举类型,有以下一些值:
ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
ElementType.FIELD:允许作用在属性字段上
ElementType.METHOD:允许作用在方法上
ElementType.PARAMETER:允许作用在方法参数上
ElementType.CONSTRUCTOR:允许作用在构造器上
ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
ElementType.ANNOTATION_TYPE:允许作用在注解上
ElementType.PACKAGE:允许作用在包上
@Constraint
源码:
@Documented
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraint {
Class<? extends ConstraintValidator<?, ?>>[] validatedBy();
}
即我们需要一个实现ConstraintValidator接口的类
public interface ConstraintValidator<A extends Annotation, T> {
void initialize(A var1);
boolean isValid(T var1, ConstraintValidatorContext var2);
}
可以看出,需要重写两个方法,一个是初始化,一个就是校验
所以我们把验证规则写在isValid里面,就能获得自己的自定义校验注解