自定义校验手机号码和电话号码注解

在项目开发时遇到了手机号校验的问题,就寻思着能不能不用每次都去程序校验,怪麻烦的。就想到了注解,直接上代码。

创建需要的两个注解

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

自定义校验手机号码和电话号码注解_第1张图片

然后在传参中需要校验的字段上加上@PhoneFlag

自定义校验手机号码和电话号码注解_第2张图片 

 到这就完成了。

也不知道实用性咋样,但是好用,欢迎大佬们提出建议

你可能感兴趣的:(annotation,java方法,annotation,java)