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)