验证枚举数据验证是否存文件名(EnumValidator):
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Method;
/**
* Author zhangzhongxian
* Date: 2021/09/11
*/
public class EnumValidator implements ConstraintValidator<com.bangdao.project.prod.annotation.Enum, Object> {
private com.bangdao.project.prod.annotation.Enum annotation;
@Override
public void initialize(com.bangdao.project.prod.annotation.Enum constraintAnnotation) {
this.annotation = constraintAnnotation;
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
Object[] objects = annotation.clazz().getEnumConstants();
try {
Method method = annotation.clazz().getMethod(annotation.method());
for (Object o : objects) {
if (value.equals(method.invoke(o))) {
return true;
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return false;
}
}
枚举数据验证注解文件(Enum):
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Author zhangzhongxian
* Date 2021/09/11
*/
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(Enum.List.class)
@Constraint(validatedBy = {EnumValidator.class})
public @interface Enum {
String message() default "{*.validation.constraint.Enum.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* the enum's class-type
*
* @return Class
*/
Class<?> clazz();
/**
* the method's name ,which used to validate the enum's value
*
* @return method's name
*/
String method() default "ordinal";
/**
* Defines several {@link Enum} annotations on the same element.
*
* @see Enum
*/
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@interface List {
Enum[] value();
}
}
枚举类(BusinessTypeEnum):
public enum BusinessTypeEnum {
COMMON(1,"业务1"),
NO_HEAT(2,"业务2"),
REHEAT(3,"业务3");
private Integer code;
private String desc;
private BusinessTypeEnum(Integer code,String desc){
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
使用方法:
@Enum(clazz = BusinessTypeEnum.class, method = "getCode", message = "业务类型有误")
private Integer businessType;