SpringMVC自定义参数校验

1,361 阅读2分钟

前言

进行SpringMVC开发的同学,肯定会使用校验,来保证输入参数的合法性,这就后端校验。如下所示,对于普通的校验,hibernate大多数可以满足我们的需求,但如果遇到不满足的,我们可以自定义,比如:手机号校验

<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>2.0.1.Final</version>
</dependency>
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>6.0.16.Final</version>
</dependency>

当引入校验框架之后,看看下面的例子,你是否回想起曾经也写过类似的代码。

@Data
public class Teacher {
  @NotBlack // 普通注解,可以划分组
  private String name;
  @Valid // 此注解可以对 Student对象中加注解的属性进行加校验
  private List<Student> students;
}

public class TeacherController {
  // 通过 @Validated 可以对当前handleMethod的参数进行校验,此处可以使用分组校验
  public Teacher getInfo(@Validated Teacher teacher) {
  }
}

那么,针对于特殊的字段,需要进行特殊的校验时,我们就需要自定义校验,下面就来详细介绍如何自定义校验。

第一步:自定义校验注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
// 指定 校验注解器
@Constraint(validatedBy = NameValidatorClass.class)
public @interface Name {
    // value值,可以接收注解中value值
    String value() default "";
    // 校验失败,提示信息
    String message() default "username is not null";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

如果注解中的属性字段没有default默认值,那么就是注解中必填字段。自定义校验注解需要绑定校验注解器

第二步:自定义校验注解器

public class NameValidatorClass implements ConstraintValidator<Name, String> {

    private String value;

    /**
     * 将注解中的值进行初始化
     * @param name 自定义注解
     * @return void
     **/
    @Override
    public void initialize(Name name) {
        // 获取自定义注解中的属性值
        this.value = name.value();
    }

    /**
     * 将传进来的值进行校验
     * @param value 提交需要被校验的值
     * @param context 上下文环境
     * @return true表示校验通过,false表示校验失败,抛出异常信息message
     **/
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return !"".equals(value);
    }
}

第三步:使用自定义注解

@Data
public class User {
    @Name(groups = {Add.class})
    private String name;
}

@PostMapping("/hello")
public R addUser(@Validated({Add.class}) User user) {
    return R.ok();
}

总结

因为校验失败会抛出异常,又因为SpringMVC推荐全局统一异常处理,所以我们只需要全局异常处理器来捕获校验失败异常,将异常结果以JSON格式返回给前端。