java 自定义注解

时间:2021-07-05 17:34:44   收藏:0   阅读:0

平常我们都会在vo实体类添加注解:如 @NotNull等注解,但是这些注解是java 自带的,所以很多时候并不满足我们的校验规则

这篇文章跟大家一起学习一下如何自定义注解:以自定义注解来校验手机号码的正确

有的人说:看完自定义注解的代码,还不如直接:

if(!ValidatorUtil.isMobile("传入手机号参数")){
   //返回错误手机号码提示
}

  我想说:这就是高级程序员和初级程序员的区别

 

下面进行主题:

 

1:首先要定义一个@interface接口,如下:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 验证是否是手机号码
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
    boolean require() default true;

    Class<?>[] groups() default {};

    String message() default "手机号码格式错误";

    Class<? extends Payload>[] payload() default {};

}

  解析:@Constraint注解的作用引入我们自定义的校验手机号码规则的类,因为我们需要自行实现手机号码是否正确的校验,所以里面的规则是自己写的

 所以:@Constraint(validatedBy = {IsMobileValidator.class}) ,就是引入自定义规则类

 

      IsMobileValidator类定义如下(注意:以下ValidatorUtil是我自己编写校验手机号码的工具类,下面也会贴出代码,当然大家也可以用网上的工具包,来校验是否是手机号码(但是近几年手机号前3位出了新的号码数,不确保网上那些工具包是否满足校验)):

import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * 手机号码校验规则 需要实现 ConstraintValidator 接口,查看其源代码,可以看到第一个参数是 A extends Annotation(其实传入自己第一步定义的@interface注解即可),第二个参数是 T (泛类型,这里传入String,就是指手机号码)
 */
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
    private boolean require = false;

//重写ConstraintValidator的initialize方法,达到初始化变量 @Override public void initialize(IsMobile constraintAnnotation) { require = constraintAnnotation.require(); }
//进行校验逻辑 @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { if (require) { return ValidatorUtil.isMobile(value); } else { if (StringUtils.isEmpty(value)) { return true; } else { return ValidatorUtil.isMobile(value); } } } }

  

ValidatorUtil工具类如下(这里类似js的校验方式,利用正则表达式校验,正则表达式如何编写,这里不描述,请大伙自行百度):

 

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * 手机号码工具类
 **/
@Slf4j
public class ValidatorUtil {
    private static Pattern MOBILE_PHONE_PATTERN = Pattern.compile("^(((13[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))+\\d{8})?$");
    private static Pattern EMAIL_PATTERN = Pattern.compile("^\\s*\\w+(?:\\.?[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$");

    /**
     * 手机号码长度
     */
    private static final int PHONE_LENGTH = 11;

    /**
     * 脱敏*号
     */
    private static final String ASTERISK = "****";

    /**
     * 手机号码脱敏
     * 截取手机号码前三位,后4为,中间4位使用*号代替
     * 18812345678
     * 188****5678
     *
     * @param phone
     * @return
     */
    public static String desensitize(String phone) {
        // 校验手机号码
        if (StringUtils.isBlank(phone)) {
            return null;
        }
        if (phone.length() != PHONE_LENGTH) {
            log.error("手机号码不合法:" + phone);
            return phone;
        }

        String before = phone.substring(0, 3);
        String after = phone.substring(7, 11);
        String desensitizePhone = before + "****" + after;
        return desensitizePhone;
    }

    public static Boolean isMobile(String str) {
        boolean isMatched = MOBILE_PHONE_PATTERN.matcher(str).matches();
        return isMatched;
    }

    public static Boolean isEmail(String str) {
        boolean isMatched = EMAIL_PATTERN.matcher(str).matches();
        return isMatched;
    }

}

  

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!