SpringBoot之自定义注解和自定义验证器validation

步骤一:创建实体类User
@Data
 @Component
 public class User {private String userId;
 private String username;
 private String password;
 private int age;//下面会自定义一个验证最小年龄的注解类}
步骤二:自定义注解MinAge

弱弱的说明:

注解的类的定义写法这里就不详解了,想必各位大佬都知道,小弟我就不献丑了,不清楚的可以花两分钟,网上搜一下,不难,这里也简单说明一下:

  1. 注解类用@interface修饰
  2. 注解类上面有四个注释
    — @Inherited 注解是都可以被继承
    — @Rentention 注解的生命周期,有三个,这里是Runtime运行时,生命周期最长
    — @Documented 文档注释,用语输出文档
    — @Target 表明注释使用的位置
    . ElementType.TYPE–>类名上
    . ElementType.FIELD–>属性上
    . ElementType.METHOD–>方法上
    — @Constraint //这里最重要,用语关联自定义的验证器,是注解生效

划重点了Constarint注解的validateBy 属性值 要写 自定义的验证器.calss
我这里是validateBy=MinAgeValidator.class

  1. 创建value属性,注意后面要加(),还可以设置默认值,用关键字default
  2. 创建message属性,用语提示错误信息
  3. 其他的属性可写可不写,这样一个基本的注解类就搞定了

@Inherited
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
 @Documented
 @Constraint(validatedBy = MinAgeValidator.class)
 public @interface MinAge {public int value() default 18;
public String message() default “”;
Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};}
步骤三:自定义关联验证器MinAgeValidator

弱弱的说明:

  1. 自定义的验证器MinAgeValidator实现ConstraintValidator接口
  2. 接口的类型,第一个参数是自定义的注解(这里是MinAge),第二个参数是需要验证的实体类的属性的类型(这里是Integer)
  3. 复写接口的两个方法 --initialize() --isValid()
  4. 第一个初始化方法可以写,可以不写,根据需求来决定
  5. 第二个isValid方法是逻辑验证方法,返回结果是true,验证通过,或者放行不验证,返回结果是false,则验证失败
  6. isValid方法的两个参数,第一个就是要验证的实体类(user)的年龄age,第二个
    参数可以不用管,逻辑验证只要处理第一个参数就行
    测试的时候,第二个参数context 设置为null就行

@Component
 public class MinAgeValidator implements ConstraintValidator<MinAge,Integer> {private Integer min;
//初始化
 @Override
 public void initialize(MinAge constraintAnnotation) {//获取MinAge注解的value属性值,并赋予this.min
 this.min = constraintAnnotation.value();
 System.out.println(“min:”+min);}
@Override
 public boolean isValid(Integer value, ConstraintValidatorContext context) {//如果age不为空,则与注解value属性值比较,如果大于注解的value值,则验证通过
 if(value!=null){
 return value>=min;
 }
 //如果值是空,则不验证放行
 return true;
 }}
步骤四:将注解标注在实体类上
@Data
 @Component
 public class User {private String userId;
 private String username;
 private String password;
 @MinAge(value=88)
 private int age;//下面会自定义一个验证最小年龄的注解类}
怎么样?

不怎么样(哭)

是不是很简单?

你猜(白眼)

赶紧搞起来!

肾不太好(六味地黄丸)