相关阅读
通用枚举工具类
定义校验注解
/**
* 枚举校验注解,null元素是合法的,如果校验的是字符串,则空字符串也是合法的
*/
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(EnumItemValue.List.class)
@Constraint(validatedBy = { EnumItemValueValidator.class })
public @interface EnumItemValue {
String message() default "错误的枚举值";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* 枚举类型
*/
Class<? extends EnumItem> enumType();
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface List {
EnumItemValue[] value();
}
}
定义校验器
public class EnumItemValueValidator implements ConstraintValidator<EnumItemValue, Object> {
private List<Object> enumValues = new ArrayList<>();
@Override
public void initialize(EnumItemValue annotation) {
Class<? extends EnumItem> enumType = annotation.enumType();
this.enumValues = EnumItemUtil.getEnumValues(enumType);
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if(value == null) {
return true;
}
if(value instanceof String) {
return !StringUtils.hasText((String)value) || enumValues.contains(value);
}
return enumValues.contains(value);
}
}
测试
public class TestAnnotationEnumItemValue {
public static void main(String[] args) {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<User>> violations = validator.validate(user(), Default.class);
System.out.println(violations.size()); // 0
}
private static User user() {
User user = new User();
user.setSex("0");
return user;
}
private static class User {
@EnumItemValue(enumType = SexEnum.class)
private String sex;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
private enum SexEnum implements EnumItem<String> {
MALE("0","男"),
FEMALE("1", "女"),
;
private final String value;
private final String text;
SexEnum(String value, String text) {
this.value = value;
this.text = text;
}
@Override
public String getValue() {
return value;
}
@Override
public String getText() {
return text;
}
}
}