基于SpringBoot的javax.validation.Validation的参数校验方法

问题描述

当要对用户输入的参数进行校验时,可以用javax.validation.Validation包下的注解进行验证,实现简单,并且是基于JSR-303标准的。

添加pom.xml依赖

	<dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-validationartifactId>
    dependency>

Controller中为要验证的POJO添加@Valid注解

	@RequestMapping("/login")
    @ResponseBody
    //使用@Valid注解进行参数校验,减少代码冗余度
    public String login(@Valid LoginVo loginVo) {
 }

在POJO类中添加注解

public class LoginVo {
    @NotNull // 不允许为空
    @isEmail //自定义注解
    private String Email;

    @NotNull
    @Length(min = 32)//长度限制,最短为32位
    private String password;
}

原生的主要注解说明

基于SpringBoot的javax.validation.Validation的参数校验方法_第1张图片

自定义注解

  1. 设计注解
//参照javax.validation.constraints包下的NotNull注解进行自定义自己的注解,添加以下四个注解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {isEmailValidator.class})// 通过Constraint注解器中的validatedBy参数,调用相应的类进行规则判定
public @interface isEmail {
    String message() default "email 格式错误"; //对email进行验证,验证不通过时返回的消息

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    //参照javax.validation.constraints;包下的NotNull注解进行自定义自己的注解,以上三个函数是必须的

    // 自定义一个函数,设置是否允许参数为空
    boolean notNull() default true; //默认设置为不允许为空
}
  1. 设计规则判定的校验类
//规则判定的校验类需要实现ConstraintValidator接口,并实现其中的方法。对应于特定的注解和用户输入的字段类型
public class isEmailValidator implements ConstraintValidator<isEmail, String> {

    private boolean notNull = false;
    
    @Override
    public void initialize(isEmail constraintAnnotation) {
        //初始化这个方法可以取到isEmail这个注解以及其中的内容
        notNull = constraintAnnotation.notNull();//将注解器中的内容取出
    }

    // value为用户输入的内容,通过这个方法进行对value校验是否合法
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        //不允许为空
        if (notNull) {
            return isEmail(value);
        } else {//允许为空
            if (value == null) {
                return true;
            } else {
                return isEmail(value);
            }
        }
    }

    // 进行email匹配,使用正则表达式匹配
    public static final Pattern email_pattern = Pattern.compile("^[A-Za-z\\d]+([-_.][A-Za-z\\d]+)*@([A-Za-z\\d]+[-.])+[A-Za-z\\d]{2,4}$");

    public static boolean isEmail(String email) {
        if (email == null) {
            return false;
        }
        Matcher matcher = email_pattern.matcher(email);
        return matcher.matches();
    }
}

你可能感兴趣的:(Spring)