如何在枚举中使用Hibernate验证批注?

成员之声

如何使用休眠注释来验证枚举成员字段?以下内容不起作用:

enum UserRole {
   USER, ADMIN;
}

class User {
   @NotBlank //HV000030: No validator could be found for type: UserRole.
   UserRole userRole;
}
塞巴斯蒂安·洛伯(Sebastien Lorber)

请注意,您还可以创建一个验证器来检查String是否为枚举的一部分。

public enum UserType { PERSON, COMPANY }

@NotNull
@StringEnumeration(enumClass = UserCivility.class)
private String title;

@Documented
@Constraint(validatedBy = StringEnumerationValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, PARAMETER, CONSTRUCTOR })
@Retention(RUNTIME)
public @interface StringEnumeration {

  String message() default "{com.xxx.bean.validation.constraints.StringEnumeration.message}";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};

  Class<? extends Enum<?>> enumClass();

}

public class StringEnumerationValidator implements ConstraintValidator<StringEnumeration, String> {

  private Set<String> AVAILABLE_ENUM_NAMES;

  @Override
  public void initialize(StringEnumeration stringEnumeration) {
    Class<? extends Enum<?>> enumSelected = stringEnumeration.enumClass();
    //Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected);
    Set<? extends Enum<?>> enumInstances = Sets.newHashSet(enumSelected.getEnumConstants());
    AVAILABLE_ENUM_NAMES = FluentIterable
            .from(enumInstances)
            .transform(PrimitiveGuavaFunctions.ENUM_TO_NAME)
            .toSet();
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    if ( value == null ) {
      return true;
    } else {
      return AVAILABLE_ENUM_NAMES.contains(value);
    }
  }

}

这很好,因为您不会丢失“错误值”的信息。您会收到类似的消息

值“ someBadUserType”不是有效的用户类型。有效的UserType值为:PERSON,COMPANY


编辑

对于那些想要非番石榴版本的人来说,应该使用类似以下的功能:

public class StringEnumerationValidator implements ConstraintValidator<StringEnumeration, String> {

  private Set<String> AVAILABLE_ENUM_NAMES;

  public static Set<String> getNamesSet(Class<? extends Enum<?>> e) {
     Enum<?>[] enums = e.getEnumConstants();
     String[] names = new String[enums.length];
     for (int i = 0; i < enums.length; i++) {
         names[i] = enums[i].name();
     }
     Set<String> mySet = new HashSet<String>(Arrays.asList(names));
     return mySet;
  }

  @Override
  public void initialize(StringEnumeration stringEnumeration) {
    Class<? extends Enum<?>> enumSelected = stringEnumeration.enumClass();
    AVAILABLE_ENUM_NAMES = getNamesSet(enumSelected);
  }

  @Override
  public boolean isValid(String value, ConstraintValidatorContext context) {
    if ( value == null ) {
      return true;
    } else {
      return AVAILABLE_ENUM_NAMES.contains(value);
    }
  }

}

并要自定义错误消息并显示适当的值,请检查以下内容:https : //stackoverflow.com/a/19833921/82609

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在VBA中使用枚举进行验证

来自分类Dev

如何在VBA中使用枚举进行验证

来自分类Dev

如何在Hibernate中使用addScalar()方法返回枚举

来自分类Dev

如何在类级变量中使用Spring @Value批注

来自分类Dev

如何在Kotlin中使用Jackson JsonSubTypes批注

来自分类Dev

如何在Android项目中使用@WorkerThread批注?

来自分类Dev

如何在Qt中使用枚举?

来自分类Dev

如何在XSD中使用枚举

来自分类Dev

如何在JAXB中使用枚举?

来自分类Dev

如何在Postgres中使用枚举

来自分类Dev

如何在枚举字段中使用CanCanCan?

来自分类Dev

如何在Python中使用GCP枚举?

来自分类Dev

如何在Qt中使用枚举?

来自分类Dev

如何在lldb中使用枚举

来自分类Dev

如何在骆驼路线中使用枚举?

来自分类Dev

如何在 p:selectOneMenu 中使用枚举

来自分类Dev

如何在角度 5 中使用枚举

来自分类Dev

如何在Ajax验证中使用WTForms?

来自分类Dev

如何在Django中使用验证器

来自分类Dev

如何在libSVM中使用交叉验证?

来自分类Dev

如何在Ajax验证中使用WTForms?

来自分类Dev

如何在Rails中使用ember验证?

来自分类Dev

如何在MATLAB中使用交叉验证

来自分类Dev

如何在 python 中使用交叉验证?

来自分类Dev

如何在开关与整数使用中使用枚举

来自分类Dev

如何在Hibernate中使用@Subselect

来自分类Dev

如何在Hibernate / JPA中使用@Formula

来自分类Dev

如何在Hibernate中使用Delete查询

来自分类Dev

如何在Hibernate中使用SELECT插入