首先是自定義@Validated注解:
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {IsMobileValidator.class}) public @interface IsMobile { //默認這個參數必須得有 boolean required() default true; //如果校驗不通過,提示什么信息 String message() default "手機號碼格式錯誤"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }
IsMobileValidator是這個注解具體的方法類:
@Slf4j public class IsMobileValidator implements ConstraintValidator<IsMobile, String> { private boolean required = false; @Override public void initialize(IsMobile constraintAnnotation) { //初始化方法,拿到注解 required = constraintAnnotation.required(); log.info("initialize方法::========>>>>"+required); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { log.info("isValid方法::========>>>>"+value); if (required) { //如果這個值是必須的 return ValidatorUtil.isMobile(value); } else { //如果這個值不是必須的,那么先判斷里面有沒有值 if (StringUtils.isEmpty(value)) { return true; } else { return ValidatorUtil.isMobile(value); //有值就判斷一下他的格式是不是手機格式 } } } }
util中是具體的方法實現:
public class ValidatorUtil { private static final String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"; private static final Pattern mobile_pattern = Pattern.compile(regex); public static boolean isMobile(String src) { if (StringUtils.isEmpty(src)) { return false; } Matcher m = mobile_pattern.matcher(src); return m.matches(); } }