1、定义注解
@Documented
@Retention(RUNTIME)
@Constraint(validatedBy = {PhoneValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
public @interface Phone {
String message() default "手机号格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
说明:
@Constraint(validatedBy = {PhoneValidator.class})
:用于指定验证器类;@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
:指定@Phone
注解可以作用在方法、字段、构造函数、参数以及类型上;
2、定义验证器类
public class PhoneValidator implements ConstraintValidator<Phone, String> {
private static final Logger LOGGER = LoggerFactory.getLogger(PhoneValidator.class);
private static final String REGEX = "^((13[0-9])|(15[^4])|(18[0-9])|(17[0-9])|(147))\d{8}$";
@Override
public boolean isValid(String s, ConstraintValidatorContext context) {
boolean result = false;
try {
result = Pattern.matches(REGEX, s);
} catch (Exception e) {
LOGGER.error("验证手机号格式时发生异常,异常信息:", e);
}
return result;
}
}
3、使用注解
@Data
public class User {
// 省略其它代码
- // @Pattern(regexp = "^((13[0-9])|(15[^4])|(18[0-9])|(17[0-9])|(147))\d{8}$", message = "手机号格式不正确")
+ @Phone
private String phone;
}
使用自定义注解实现业务验证的一个比较大的优点是可以复用。所有需要进行手机号格式验证的属性,只需要添加上@Phone
注解就可以了。如果后期我们需要修改手机号的验证规则,只需要修改PhoneValidator
类中的验证逻辑,就可以作用于所有添加了@Phone
注解的字段了。