枚举校验
自定义注解及校验实现
import lombok.extern.slf4j.Slf4j;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.Arrays;
/**
* 自定义枚举验证注解
*/
@Target( {ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValidation.Validator.class)
@Documented
public @interface EnumValidation {
/**
* 错误提示信息
*
* @return
*/
String message() default "Enumeration validation failed";
/**
* 校验分组
*
* @return
*/
Class<?>[] groups() default {};
/**
* 要检验参数所属的枚举数组
*
* @return
*/
Class<? extends EnumType>[] enums() default {};
int[] enumTypes() default {};
/**
* 要校验的参数是否可以为空
*
* @return
*/
boolean require() default false;
/** 默认配置 - 不加要报错 */
Class<? extends Payload>[] payload() default {};
// 验证器内部类
@Slf4j
class Validator implements ConstraintValidator<EnumValidation, Integer> {
Class<? extends EnumType>[] enums;
boolean require;
int[] enumTypes;
@Override
public void initialize(EnumValidation constraintAnnotation) {
this.enums = constraintAnnotation.enums();
this.require = constraintAnnotation.require();
this.enumTypes = constraintAnnotation.enumTypes();
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
//如果校验的字段为空,判断是否通过
if ( value == null) {
return require ? false:true;
}
if(enums != null && enums.length != 0){
//校验枚举字段匹配
for (Class<? extends EnumType> clazz : enums) {
if (clazz.isEnum()) {
EnumType[] enumConstants = clazz.getEnumConstants();
for (EnumType enumType : enumConstants) {
if (value == enumType.getCode()) {
return true;
}
}
}
}
}
if(enumTypes != null && enumTypes.length != 0){
return Arrays.stream(enumTypes).anyMatch(et -> et == value);
}
return false;
}
}
}
用法
@EnumValidation(enums = PDEnum.taskType.class, require = true, message = "taskType盘点维度不存在")
@EnumValidation(enumTypes = {10,20}, require = true, message = "btsStatus不存在")
纸上得来终觉浅,绝知此事要躬行。

浙公网安备 33010602011771号