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)