无法仅为枚举创建通用 javax 验证器



我正在尝试为枚举字段定义尽可能通用的验证注释(即仅适用于枚举字段类型,以及所有类型的枚举(。

目标是拥有一个注释,该注释将仅授权枚举中的某些值。

我以这种方式创建了注释:

@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

我想访问带注释的字段枚举,而不在注释参数中包含枚举类。所以我试图使验证器成为通用的。

但是我在注释定义上收到此编译错误:

@Constraint(validatedBy = { EnumRestreintValidator.class })
// Type mismatch: cannot convert from Class<EnumRestreintValidator> to Class<? extends ConstraintValidator<?,?>>

是否可以像我打算的那样使用通用验证器?还是我被迫在注释参数中传递枚举类型?

我已经成功地创建了一个装饰器,可以验证 Enum 变量是否具有在 Enum 值的给定范围内的值。

请参阅github要点。

// EnumRestreint.java
@Target({ FIELD })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { EnumRestreintValidator.class })
public @interface EnumRestreint {
String message() default "The enum value is not included in the possibles values.";
String[] authorizedFields() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
// EnumRestreintValidator.java
/**
* Restreint possibles values from Enum
*/
public class EnumRestreintValidator implements ConstraintValidator<EnumRestreint, Enum<?>> {
/** The possible values you can pick from the parameterized enum */
Set<String> validFields;
@Override
public void initialize(EnumRestreint constraint) {
validFields = Arrays.stream(constraint.authorizedFields()).collect(Collectors.toSet());
}
@Override
public boolean isValid(Enum<?> enumValue, ConstraintValidatorContext constraintValidatorContext) {
return validFields.contains(enumValue.name());
}
}

最新更新