Я пытаюсь определить аннотацию проверки для полей Enum как можно более общей (т. Е. Работать только с типом поля Enum и для всех типов Enum).
Цель состоит в том, чтобы иметь аннотацию, котораяавторизует только некоторые значения в перечислении.
Я создал аннотацию следующим образом:
@Target({ FIELD })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { EnumRestreintValidator.class })
public @interface EnumRestreint {
String message() default "The field value is not included in the authorized values.";
String[] authorizedFields() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Затем валидатор:
public class EnumRestreintValidator<T extends Enum<T>> implements ConstraintValidator<EnumRestreint, T> {
Set<T> validFields;
@Override
public void initialize(EnumRestreint constraint) {
validFields = Arrays.stream(constraint.authorizedFields()).collect(Collectors.toSet());
}
@Override
public boolean isValid(T enumValue, ConstraintValidatorContext constraintValidatorContext) {
return false; // Not implemented yet
}
}
Пример использования:
@EnumRestreint(authorizedValues = { "BANANA", "APPLE" })
private Fruits value; // validator should break if value == Fruits.ORANGE
Я хочу получить доступ к аннотированному полю enum без включения класса enum в параметры аннотации. Поэтому я попытался сделать универсальный валидатор.
Но я получаю эту ошибку компиляции в определении аннотации:
@Constraint(validatedBy = { EnumRestreintValidator.class })
// Type mismatch: cannot convert from Class<EnumRestreintValidator> to Class<? extends ConstraintValidator<?,?>>
Можно ли использовать универсальный валидатор, так как ясобираешься делать? Или я вынужден передать тип перечисления в параметрах аннотации?