2013-08-13 8 views

Répondre

28

Notez que vous pouvez également créer un validateur pour vérifier qu'une chaîne fait partie d'une énumération.

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

} 

C'est agréable parce que vous ne perdez pas les informations de la "valeur erronée". Vous pouvez obtenir un message comme

La valeur "someBadUserType" n'est pas un UserType valide. UserType valide valeurs sont les suivantes: PERSONNE, SOCIÉTÉ


Modifier

Pour ceux qui veulent une version non-Goyave il devrait fonctionner avec quelque chose comme:

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

} 

Et Personnalisez le message d'erreur et affichez les valeurs appropriées, vérifiez ceci: https://stackoverflow.com/a/19833921/82609

+0

Comment cela doit-il être écrit sans les fonctions de goyave? – membersound

+1

@membersound vraiment il n'y a aucune complexité à faire tout cela. Vous avez juste à transformer un tableau d'enum ('enumSelected.getEnumConstants()' en un ensemble de noms enum ('AVAILABLE_ENUM_NAMES') et vous trouverez facilement des tutoriels pour le faire avec Java :) voir ici http: // stackoverflow. com/questions/13783295/get-all-names-in-an-enum-as-a-string –

+0

OK désolé, probablement j'ai mal compris: je pensais qu'il serait possible de créer un message d'erreur générique par défaut, et à l'intérieur imprimer tous les valeurs enum génériques., – membersound

9

@NotBlank

Valider que la chaîne annotée est non nul ou vide. La différence avec NotEmpty est que les espaces de fin sont ignorés.

Où que UserRole n'est pas une chaîne et object Utilisez @NotNull

L'élément annoté ne doit pas être nul. Accepte n'importe quel type.

Questions connexes