java - 无法仅为 Enum 创建通用 javax validator

标签 java validation generics enums

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

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

我这样创建注释:

@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 {};
}

然后是 validator :

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

我想访问带注释的字段枚举,而不在注释参数中包含枚举类。所以我尝试使 validator 变得通用。

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

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

是否可以像我想要的那样使用通用 validator ?或者我是否被迫在注释参数中传递枚举类型?

最佳答案

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

参见github gist .

// 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());
    }
}

关于java - 无法仅为 Enum 创建通用 javax validator ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58267178/

相关文章:

java - java内存泄漏

java - hibernate validator : Custom Meassages

email - 验证电子邮件地址表单提交

java - 从父类(super class)型方法返回子类类型

c# 通过 WCF 将 arraylist 从客户端传递到服务器端

Java PDFBox 为 PDF 表单中的几个字段设置自定义字体

java - 操作一组变量的有效方法是什么?

jdk 1.3中java unicode编码文件读取问题

javascript - Blur 上的个人输入验证

java - 方法不适用于参数,可能存在异常类型删除问题吗?