在项目开发时遇到了手机号校验的问题,就寻思着能不能不用每次都去程序校验,怪麻烦的。就想到了注解,直接上代码。
创建需要的两个注解
1.方法上的注解,标明这个方法需要进行校验
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPhone {
}
2.字段上的注解,标明这个字段需要进行校验
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PhoneFlag {
}
3. 创建相应的Aspect
@Aspect
@Component
public class CheckPhoneAspect {
@Before("@annotation(xx.xx.CheckPhone)")
public void before(JoinPoint point) throws Throwable {
// 获取所有参数
Object[] args = point.getArgs();
for (Object arg : args) {
if (null == arg){
return;
}
Class c = arg.getClass();
// 获取class对象内的字段
Field[] fields = c.getDeclaredFields();
if (null != fields){
for (Field field : fields) {
String methodName = "get";
// 字段名称
String name = field.getName();
// 组装获取字段方法名
String first = name.substring(0,1).toUpperCase();
if (name.length() > 1){
String second = name.substring(1, name.length());
methodName = methodName.concat(first).concat(second);
}else {
methodName = methodName.concat(first);
}
// 获取xx注解
PhoneFlag annotation = field.getAnnotation(PhoneFlag.class);
if (null != annotation){
String phone = (String) c.getMethod(methodName).invoke(arg);
if (StringUtils.isNotBlank(phone)){
if (!PhoneUtils.isTel(phone) && !PhoneUtils.isMobile(phone)){
throw new CloudException(9999,"电话格式不正确");
}
}
}
}
}
}
}
}
4. 校验方法:手机号,座机号
public class PhoneUtils {
private static final String REGEX_MOBILE ="((\\+86|0086)?\\s*)((134[0-8]\\d{7})|(((13([0-3]|[5-9]))|(14[5-9])|15([0-3]|[5-9])|(16(2|[5-7]))|17([0-3]|[5-8])|18[0-9]|19([0-9]))\\d{8})|(14(0|1|4)0\\d{7})|(1740([0-5]|[6-9]|[10-12])\\d{7}))";
/**
* 正则:固定电话号码,可带区号,然后至少6,8位数字
*/
private static final String REGEX_TEL = "^(\\d{3,4}-)?\\d{6,8}$";
private static final Pattern PATTERN_REGEX_TEL = Pattern.compile(REGEX_TEL);
/**
* 判断是否是手机号
* @param tel 手机号
* @return boolean true:是 false:否
*/
public static boolean isMobile(String tel) {
if (StringUtils.isEmpty(tel)){
return false;
}
return Pattern.matches(REGEX_MOBILE, tel);
}
/**
* 验证固定电话号码
*/
public static boolean isTel( String str) {
return isMatch(PATTERN_REGEX_TEL, str);
}
public static boolean isMatch(Pattern pattern, String str) {
return StringUtils.isNotEmpty(str) && pattern.matcher(str).matches();
}
public static void main(String[] args) {
System.out.println(isTel("2887438"));
}
}
测试步骤,在对应的controller方法上添加@CheckPhone
然后在传参中需要校验的字段上加上@PhoneFlag
到这就完成了。
也不知道实用性咋样,但是好用,欢迎大佬们提出建议