自定义校验注解

Exisi 2022-06-28 22:51:14
Categories: Tags:
  • Hibernate Validator 校验框架默认提供的参数校验实际情况下可能无法满足我们的需求,我们可以自定义注解校验注解,实现对不同需求下对参数的校验。

 

  • 自定义注解可以通过 Hibernate Validator 的元注解定义一个注解接口,只需要自定注解包含的纺染和绑定实现了 ConstraintValidator 接口的类既可(ConstraintValidator 是一个泛型接口,需要指定两个类型参数,自定义注解类型与修饰目标的类型)

 

  •  Hibernate Validator 提供了以下元注解

注解

描述

@Target( { ElementType.FIELD } )

指定当前自定义注解的标注位置

标注位置

描述

ElementType.TYPE

类,接口(包括注解类型)或枚举

ElementType.FIELD

字段(包括枚举常量)

ElementType.METHOD

方法

ElementType.PARAMETER

参数

ElementType.CONSTRUCTOR

构造函数

ElementType.LOCAL_VARIABLE

局部变量

ElementType.ANNOTATION_TYPE

注解类型

ElementType.PACKAGE

ElementType.TYPE_PARAMETER

类型参数

ElementType.TYPE_USE

使用类型

@Retention()

指定注解的保留策略

策略

描述

RetentionPolicy.SOURCE

注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。

RetentionPolicy.CLASS

注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

RetentionPolicy.RUNTIME

注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。

@Constraint( validatedBy = { } )

指定了当前注解进行校验使用的校验类

示例

  • Phone.java

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = PhoneValidator.class)

public @interface Phone {

 

    String message() default "手机号码格式有误";

 

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

 

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

 

}

 

  • PhoneValidator

public class PhoneValidator implements ConstraintValidator<Phone, Object> {

 

    @Override

    public boolean isValid(Object telephone, ConstraintValidatorContext constraintValidatorContext) {

        String pattern = "^1[3|4|5|7|8]\\d{9}$";

        return Pattern.matches(pattern, telephone.toString());

    }

}

 

  • User.java

public class User {

 

@phone

private String phone;

 

 // standard constructors / setters / getters / toString

 

}

 

  • MainController.java

@Controller

Public class MainController(){

@RequestMapping("/test")    

public String testValid(@Valid User user, BindingResult result){

   

    return "test";

}

 

@RequestMapping("/test1")    

public String testValidated(@Validated User user, BindingResult result){

   

    return "test";

}

}

定义一个注解,由于要使用 ConstraintValidator 进行校验,groups payload 这两个参数是必要的。groups可以用于注解的分组校验。通过groups可以指定该注解在插入/删除的环境下生效。payload 往往用于存储注解的元素信息。