【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制

简介: 【SpringBoot】Validator组件+自定义约束注解实现手机号码校验和密码格式限制



前言

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):

<!-- validation组件-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

封装一个登录参数类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<? extends Payload>[] 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<IsMobile,String> {
    //必填
    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组件+自定义约束注解实现手机号码校验和密码格式限制的讲解。

相关文章
|
13天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
2天前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
|
4天前
|
Java Spring 容器
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
14 1
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
|
4天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的华强北商城二手手机管理系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的华强北商城二手手机管理系统的详细设计和实现
|
4天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的欢迪迈手机商城设计与开发的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的欢迪迈手机商城设计与开发的详细设计和实现
|
4天前
|
缓存 NoSQL Java
Spring Cache之本地缓存注解@Cacheable,@CachePut,@CacheEvict使用
SpringCache不支持灵活的缓存时间和集群,适合数据量小的单机服务或对一致性要求不高的场景。`@EnableCaching`启用缓存。`@Cacheable`用于缓存方法返回值,`value`指定缓存名称,`key`定义缓存键,可按SpEL编写,`unless`决定是否不缓存空值。当在类上使用时,类内所有方法都支持缓存。`@CachePut`每次执行方法后都会更新缓存,而`@CacheEvict`用于清除缓存,支持按键清除或全部清除。Spring Cache结合Redis可支持集群环境。
37 5
|
5天前
|
Java Python Spring
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
小唐开始学 Spring Boot——(2)Spring Boot核心配置与注解
|
12天前
|
Java
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
Springboot 使用自定义注解结合AOP方式校验接口参数
|
13天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
13天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
10 0

热门文章

最新文章