Java 用于根据枚举类型验证字符串的自定义批注

Java 用于根据枚举类型验证字符串的自定义批注,java,validation,enums,annotations,hibernate-validator,Java,Validation,Enums,Annotations,Hibernate Validator,我正在尝试编写一个自定义注释,根据特定的枚举验证字符串。我正在使用Hibernate验证程序API。所需的用例如下所示 @MessageTypeOf(MessageType.NETWORK) private String message; 字符串应根据作为枚举参数给出的枚举的toString()方法中给出的值进行验证(在本例中,MessageType.NETWORK) 我已经写了一个验证器,看起来像这样 public class MessageTypeValidator implements

我正在尝试编写一个自定义注释,根据特定的
枚举验证
字符串
。我正在使用
Hibernate验证程序API
。所需的用例如下所示

@MessageTypeOf(MessageType.NETWORK)
private String message;
字符串
应根据作为枚举参数给出的枚举的
toString()
方法中给出的值进行验证(在本例中,
MessageType.NETWORK

我已经写了一个验证器,看起来像这样

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> {

    private Set<String> values;

    @Override
    public void initialize(MessageTypeOf constraintAnnotation) {
        values = Arrays.asList(MessageType.values())
                .stream()
                .map(v -> v.toString())
                .collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null) return false;

        return values.contains(s);
    }
}
公共类MessageTypeValidator实现ConstraintValidator{
私有设定值;
@凌驾
public void initialize(MessageTypeOf constraintanotation){
values=Arrays.asList(MessageType.values())
.stream()
.map(v->v.toString())
.collect(收集器.toSet());
}
@凌驾
公共布尔值有效(字符串s、ConstraintValidatorContext ConstraintValidatorContext){
如果(s==null)返回false;
返回值。包含个;
}
}
以及注释

@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE })
@Retention(RUNTIME)
@Constraint(validatedBy = MessageTypeValidator.class)
@Documented
public @interface MessageTypeOf {

    String message() default "{org.hibernate.validator.referenceguide.chapter06.CheckCase." +
            "message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    MessageType value();

    @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        MessageType[] value();
    }
}
@Target({FIELD,METHOD,PARAMETER,ANNOTATION\u TYPE,TYPE\u USE})
@保留(运行时)
@约束(validatedBy=MessageTypeValidator.class)
@记录
public@interface MessageTypeOf{
String message()默认值“{org.hibernate.validator.referenceguide.chapter06.CheckCase。”+
“消息}”;
类[]组()默认值{};

类因此,该属性的唯一有效值基本上是
MessageType.NETWORK.toString()
,对吗?这很奇怪(希望客户端提供一个只能有一个有效值的字符串),但无论如何,您只需要检查:

public class MessageTypeValidator implements ConstraintValidator<MessageTypeOf, String> {

    private String validValue;

    @Override
    public void initialize(MessageTypeOf constraintAnnotation) {
        this.validValue = constraintAnnotation.value().toString();
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return this.validValue.equals(s);
    }
}
公共类MessageTypeValidator实现ConstraintValidator{
私有字符串有效值;
@凌驾
public void initialize(MessageTypeOf constraintanotation){
this.validValue=ConstraintAnotation.value().toString();
}
@凌驾
公共布尔值有效(字符串s、ConstraintValidatorContext ConstraintValidatorContext){
返回此.validValue.equals;
}
}

不直接使用枚举作为字段类型有什么原因吗?