SpringBoot项目实现Validator组件+自定义约束注解(自定义校验规则)@IsMobile校验手机号码以及密码格式限制。
- @Constraint注解是Java Bean Validation框架中的一个注解,用于自定义约束注解,即自定义校验规则。
- 通过在自定义注解上添加@Constraint注解,可以将该注解标记为一个自定义约束注解。同时,需要指定一个实现了ConstraintValidator接口的验证器类,用于验证该注解所标记的字段或参数是否符合自定义的校验规则。
@Constraint注解的属性:
使用@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 extends Payload>[] payload() default {}; }
按照前面的介绍:
具体验证逻辑类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); } } } }
综上,以后在登录时,登录信息用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组件+自定义约束注解实现手机号码校验和密码格式限制的讲解。