如何自定义Spring validation注解
在工作中我们常常使用spring validation来进行参数的校验工作。例如使用NotNull,NotBlank等注解,但是实际工作中
往往内置注解满足不了业务需求。所以我们可以通过自己来实现自定义注解满足实际的业务需求
自定义解析器
public class OpenBankDateCheck implements ConstraintValidator<OpenBankDate, LocalDate> {
@Override
public void initialize(OpenBankDate openBankDate) {
//初始化可以不用做什么事情
}
@Override
public boolean isValid(LocalDate localDate, ConstraintValidatorContext constraintValidatorContext) {
if(localDate == null){
return false;
}
//开户用户必须小于十八岁
if(localDate.plusYears(18).compareTo(LocalDate.now())<=0){
return true;
}
return false;
}
}
- 首先需要实现ConstraintValidator接口,这里的泛型,第一个是自定义注解,第二个是注解修饰的属性类型,然后我们需要重写isValid方法,如果返回true,则表示验证通过,如果返回false,表示验证失败并抛出MethodArgumentNotValidException。--- 这里的传入的第一个参数就是需要验证的字段值。既然已经拿到验证字段了,我们便可以使用正则表达式来进行我们业务逻辑的校验。
- 这里自定义注解需要使用@Constraint来进行修饰,validatedBy就是我们上方写的注解校验器。
- 这里需要注意一定要加上groups属性来提供分组校验功能,否则valid校验的时候会抛出异常提示没有groups属性。
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(value = ElementType.FIELD)
@Constraint(validatedBy = OpenBankDateCheck.class)
public @interface OpenBankDate {
String message() default "Our applicants have to be at least 18 years old at the date of application";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
运行效果如下:
运行效果.png