1、想使用枚举作为参数校验对象,减少手工代码量。
2、有些参数是固定的,列举校验,减少…
一、枚举模式
1、一般枚举
注释
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = EnumValidator.class)
public @interface EnumValid {
Class<?> value() ;
String message() default "入参值不在正确枚举中";
/**
* 默认反射调用的方法
* @return 返回方法参数
*/
String method() default "getName";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
校验器
@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, String> {
/**
* 枚举代码
*/
private final Set<String> codeList = new HashSet<>();
@Override
public void initialize(EnumValid enumValid) {
Class<?> clazz = enumValid.value();
Object[] objects = clazz.getEnumConstants();
try {
// 反射获取对应方法
Method method = clazz.getMethod(enumValid.method());
Object value;
for (Object obj : objects) {
// 调用 获取校验值
value = method.invoke(obj);
codeList.add((String) value);
}
} catch (Exception e) {
log.error("处理枚举校验异常: ", e);
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
return null == value || codeList.contains(value);
}
}
默认使用
非默认使用
使用getAlg作为参数初始化获取函数
枚举对象示例:
二、列举模式
1、字符列举
注释
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = StrValidator.class)
public @interface StrValid {
String[] value() default {};
String message() default "str val is not found";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
校验器
public class StrValidator implements ConstraintValidator<StrValid, String> {
private Set<String> limitValues;
@Override
public void initialize(StrValid flagValidator) {
limitValues = Arrays.stream(flagValidator.value()).collect(Collectors.toSet());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (StringUtils.isBlank(value)) {
//当状态为空时使用默认值
return true;
}
return limitValues.contains(value);
}
}
用法
2、整型列举
注释
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = IntValidator.class)
public @interface IntValid {
int [] value();
String message() default "int val error";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
校验器
@Slf4j
public class IntValidator implements ConstraintValidator<IntValid, Integer> {
/**
* 限制内容
*/
private int[] limitValues;
@Override
public void initialize(IntValid flagValidator) {
limitValues = flagValidator.value();
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
if (null == value) {
//当状态为空时使用默认值
return true;
}
for (int limitValue : limitValues) {
if (limitValue == value) {
return true;
}
}
return false;
}
}
用法
最后:
以上校验器不校验空值,不为空需要添加@NotNull注释