自定义校验注解
在前后端分离的开发中,我们常见的使用Validator进行校验,但是有时候这个框架的一些注解并不能满足我们生产中的所有需求,就比如后端需要判断一个状态值只能是0或者1或者2,这个时候就需要自定义一个注解了。
自定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
// FlagValidatorClass.class 这个类就是验证是否通过
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator {
// value就是需要传值的,这里使用数组,即前端传来的值只要这个数组里存在就通过
int[] value() default {};
// 参数校验失败的时候返回的默认信息
String message() default "flag is not found";
// 分组使用
Class<?>[] groups() default {};
// 不知道是啥,反正都有,写上总没错
Class<? extends Payload>[] payload() default {};
}
自定义校验逻辑
//第一个参数需要指定为你自定义的校验注解类
// 第二个指定为你要校验属性的类型,如果前端传的是List那这里的Integer就变成List<String>,就是需要接受前端数据的数据类型
//isValid方法中就是具体的校验逻辑
public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Integer> {
private FlagValidator constraint;
// 一般来说如果用到了自定义注解里面的值,从这个初始化方法中给全局变量赋值,方便isValis()方法中使用
@Override
public void initialize(FlagValidator constraint) {
this.constraint = constraint;
}
/**
* 第一个参数value就是接收到的前端的值
* 第二个参数目前没用到
* 如果返回true就表示通过,false就表示校验失败,返回默认的信息
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
// 如果前端不传值返回false,返回错误异常
if(value == null) {
return false;
}
// 这个values就是你放在注解上的value数组,即 @FlagValidator(value = {0,1},message = "预约状态参数错误") 这里面的value值
int[] values = constraint.value();
// 遍历设定的值,当有一个值等于的话,就放行,否则拒绝放行
for (int i : values) {
if (i == value) {
return true;
}
}
return false;
}
}
在字段上添加自定义注解
/**
* 预约状态 0未启动 1启用中
*/
@NotNull(message = "预约状态不可为空",groups = CreateGroup.class)
@FlagValidator(value = {0,1},message = "预约状态参数错误")
private Integer roomAppStatus;
这个时候,前端传来值0或者1都可以放行通过,只要前端传的不是0或者1或者为空的话,就会返回异常信息。