package com.migu.redstone.quanyi;
import org.apache.commons.lang.StringUtils;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = EnumValid.EnumValidatorHandle.class)
public @interface EnumValid {
String[] enums();
Class[] sourceClass() default {};
boolean isNull() default false;
String message() default "入参值不在正确枚举中";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class EnumValidatorHandle implements ConstraintValidator, Annotation {
private List enums = new ArrayList();
private boolean isNull = false;
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
@Override
public void initialize(EnumValid constraintAnnotation) {
this.isNull = constraintAnnotation.isNull();
String[] enums = constraintAnnotation.enums();
if (enums.length == 0) {
Class<? extends IEnumSource>[] classes = constraintAnnotation.sourceClass();
if (classes.length>0){
IEnumSource explicitInterface = SpringContextUtil.getBean(classes[0]);
this.enums = explicitInterface.source();
}
} else {
this.enums = Arrays.asList(enums);
}
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value instanceof String) {
return (isNull && StringUtils.isBlank((String) value))
|| (StringUtils.isNotBlank((String) value) && enums.contains(value));
} else {
return (isNull && Objects.isNull(value))
|| (Objects.nonNull(value) && enums.contains(value.toString()));
}
}
}
/**
* 动态枚举实现该接口
*/
public static interface IEnumSource {
List source();
}
}