SpringBoot之自定义注解和自定义验证器validation
步骤一:创建实体类User
@Data
@Component
public class User {private String userId;
private String username;
private String password;
private int age;//下面会自定义一个验证最小年龄的注解类}
步骤二:自定义注解MinAge
弱弱的说明:
注解的类的定义写法这里就不详解了,想必各位大佬都知道,小弟我就不献丑了,不清楚的可以花两分钟,网上搜一下,不难,这里也简单说明一下:
- 注解类用@interface修饰
- 注解类上面有四个注释
— @Inherited 注解是都可以被继承
— @Rentention 注解的生命周期,有三个,这里是Runtime运行时,生命周期最长
— @Documented 文档注释,用语输出文档
— @Target 表明注释使用的位置
. ElementType.TYPE–>类名上
. ElementType.FIELD–>属性上
. ElementType.METHOD–>方法上
— @Constraint //这里最重要,用语关联自定义的验证器,是注解生效
划重点了 ,Constarint注解的validateBy 属性值 要写 自定义的验证器.calss
我这里是validateBy=MinAgeValidator.class
- 创建value属性,注意后面要加(),还可以设置默认值,用关键字default
- 创建message属性,用语提示错误信息
- 其他的属性可写可不写,这样一个基本的注解类就搞定了
@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
弱弱的说明:
- 自定义的验证器MinAgeValidator实现ConstraintValidator接口
- 接口的类型,第一个参数是自定义的注解(这里是MinAge),第二个参数是需要验证的实体类的属性的类型(这里是Integer)
- 复写接口的两个方法 --initialize() --isValid()
- 第一个初始化方法可以写,可以不写,根据需求来决定
- 第二个isValid方法是逻辑验证方法,返回结果是true,验证通过,或者放行不验证,返回结果是false,则验证失败
- 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;//下面会自定义一个验证最小年龄的注解类}
怎么样?
不怎么样(哭)
是不是很简单?
你猜(白眼)
赶紧搞起来!
肾不太好(六味地黄丸)