【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制
作者:mmseoamin日期:2024-02-18

【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制,在这里插入图片描述,第1张


🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》
🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、@Constraint介绍
    • 用法
    • 二、具体实现
    • 总结

      前言

      SpringBoot项目实现Validator组件+自定义约束注解(自定义校验规则)@IsMobile校验手机号码以及密码格式限制。


      一、@Constraint介绍

      • @Constraint注解是Java Bean Validation框架中的一个注解,用于自定义约束注解,即自定义校验规则。
      • 通过在自定义注解上添加@Constraint注解,可以将该注解标记为一个自定义约束注解。同时,需要指定一个实现了ConstraintValidator接口的验证器类,用于验证该注解所标记的字段或参数是否符合自定义的校验规则。

      用法

      @Constraint注解的属性:

      • validatedBy:用于指定实现了ConstraintValidator接口的验证器类。该属性的值是一个Class对象数组,可以指定多个验证器类。
      • message:用于指定当校验失败时,所返回的错误信息。可以使用占位符{},在校验器中使用具体的参数替换。
      • groups:用于指定分组,即根据不同的分组应用不同的校验规则。
      • payload:用于指定元数据,即可以通过该属性传递一些额外的验证信息。

        使用@Constraint注解,可以通过自定义注解的方式,为字段或参数添加自定义的校验规则,并实现校验逻辑。这样,在进行参数校验时,可以方便地通过注解的方式来调用自定义的校验规则。

        ConstraintValidator接口,它有两个泛型,第一个是自定义的注解类,第二个就是要验证的数据的类型,有两个方法,分别是initialize(初始化方法)和isValid(验证逻辑方法),返回true,则验证通过,否则是不通过。

        二、具体实现

        • 在做项目登录时,我采用的是手机号+密码登录,这时就需要手机号校验和密码格式限制,这些正确后再去数据库验证手机号密码是否正确。
        • 手机号:11位且符合手机号格式规定,不为空;密码:最短为6位,不为空。

        引入组件依赖(SpringBoot版本选择的是2.6.3):

        
        
        	org.springframework.boot
        	spring-boot-starter-validation
        
        

        封装一个登录参数类LoginVo:

        import com.example.seckill.validator.IsMobile;
        import lombok.Data;
        import org.hibernate.validator.constraints.Length;
        import javax.validation.constraints.NotNull;
        /**
         * @Version: 1.0.0
         * @Author: Dragon_王
         * @ClassName: LoginVo
         * @Description: 登录参数
         * @Date: 2024/1/23 17:18
         */
        @Data
        public class LoginVo {
            @NotNull
            @IsMobile
            private String mobile;
            @NotNull
            @Length(min = 6)
            private String password;
        }
        

        其中@IsMobile是自定义的校验手机号的注解。其他注解是validation组件中的。可以看到实现了不为空以及密码格式限制(最少六位),组件内还有许多注解,自己查询使用。下面看一下手机号校验的具体实现。

        创建手机号校验工具类:

        import org.springframework.util.StringUtils;
        import java.util.regex.Matcher;
        import java.util.regex.Pattern;
        /**
         * @Version: 1.0.0
         * @Author: Dragon_王
         * @ClassName: ValidatorUtil
         * @Description: 手机号码校验
         * @Date: 2024/1/23 17:48
         */
        public class ValidatorUtil {
            private static final Pattern mobile_pattern = Pattern.compile("^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$");
            public static boolean isMobile(String mobile){
                if (StringUtils.isEmpty(mobile)){
                    return false;
                }
                Matcher matcher = mobile_pattern.matcher(mobile);
                return matcher.matches();
            }
        }
        

        创建自定义注解@IsMobile:

        import com.example.seckill.vo.IsMobileValidator;
        import javax.validation.Constraint;
        import javax.validation.Payload;
        import java.lang.annotation.*;
        /**
         * @Version: 1.0.0
         * @Author: Dragon_王
         * @ClassName: isMobile
         * @Description: 验证是否是手机号
         * @Date: 2024/1/24 13:47
         */
        @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 required() default true;
            String message() default "手机号码格式错误";
            Class[] groups() default {};
            Class[] payload() default {};
        }
        

        按照前面的介绍:

        • validatedBy是指定验证器,即具体验证逻辑类:IsMobileValidator。
        • message:用于指定当校验失败时,所返回的错误信息。
        • 这里的required是代表当前校验数据为必填:在具体验证逻辑类有实现。
        • 其他是默认的。

          具体验证逻辑类IsMobileValidator:

          import com.example.seckill.utils.ValidatorUtil;
          import com.example.seckill.validator.IsMobile;
          import org.springframework.util.StringUtils;
          import javax.validation.ConstraintValidator;
          import javax.validation.ConstraintValidatorContext;
          /**
           * @Version: 1.0.0
           * @Author: Dragon_王
           * @ClassName: IsMobileValidator
           * @Description: 手机号校验
           * @Date: 2024/1/24 13:52
           */
          public class IsMobileValidator implements ConstraintValidator {
              //必填
              private boolean required = false;
              @Override
              public void initialize(IsMobile constraintAnnotation) {
                  required = constraintAnnotation.required();
              }
              @Override
              public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
                  if (required) {
                      return ValidatorUtil.isMobile(s);
                  }else {
                      if (StringUtils.isEmpty(s)){
                          return true;
                      }else {
                          return ValidatorUtil.isMobile(s);
                      }
                  }
              }
          }
          
          • 该类继承ConstraintValidator,且泛型IsMobile指自定义注解类,String指是校验数据类型。
          • initialize初始化方法:这里初始化获得注解类的默认值。
          • isValid是校验逻辑,参数s是校验字符串。如果required为true则调用工具类校验手机号;如果不是true,则判断校验字符串是否为空,为空则通过,因为有@NotNull,所以这里无需校验空白,若字符串不为空,调用工具类校验手机号。

            综上,以后在登录时,登录信息用LoginVo接收封装,自动校验手机号和密码,如下:

            /***
                 * @Description: 登录功能,这里会将登录信息手机号和密码自动封装为LoginVo接收,不知道的大家可以回顾一下SpringMVC。
                 * @param loginVo
                 * @methodName: doLogin
                 * @return: com.example.seckill.vo.RespBean
                 * @Author: dragon_王
                 * @Date: 2024-01-23 17:23:02
                 */
                @RequestMapping("/doLogin")
                @ResponseBody
                public RespBean doLogin(LoginVo loginVo){
                    return userService.doLogin(loginVo);
                }
            

            总结

            以上就是Validator组件+自定义约束注解实现手机号码校验和密码格式限制的讲解。