- Hibernate Validator 校验框架默认提供的参数校验实际情况下可能无法满足我们的需求,我们可以自定义注解校验注解,实现对不同需求下对参数的校验。
- 自定义注解可以通过 Hibernate Validator 的元注解定义一个注解接口,只需要自定注解包含的纺染和绑定实现了 ConstraintValidator 接口的类既可(ConstraintValidator 是一个泛型接口,需要指定两个类型参数,自定义注解类型与修饰目标的类型)
- Hibernate Validator 提供了以下元注解
注解 |
描述 |
||||||||||||||||||||||
@Target( { ElementType.FIELD } ) |
指定当前自定义注解的标注位置
|
||||||||||||||||||||||
@Retention() |
指定注解的保留策略
|
||||||||||||||||||||||
@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 往往用于存储注解的元素信息。