2013-08-13 18 views

risposta

28

Nota è anche possibile creare un validatore per verificare se una stringa fa parte di un'enumerazione.

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

} 

Questo è bello perché non si perde l'informazione del "valore sbagliato". È possibile ottenere un messaggio come

Il valore "someBadUserType" non è un tipo utente valido. UserType valido valori sono: persona, società


Modifica

Per chi vuole una versione non Guava dovrebbe funzionare con qualcosa come:

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

} 

E per personalizzare il messaggio di errore e visualizzare i valori appropriati, verificare: https://stackoverflow.com/a/19833921/82609

+0

Come si può scrivere questo senza le funzioni guava? – membersound

+1

@membersound davvero non c'è alcuna complessità a farlo. Devi solo trasformare un array di enum ('enumSelected.getEnumConstants()' in un Set di nomi enum ('AVAILABLE_ENUM_NAMES') e troverai facilmente tutorial per farlo con Java :) vedi qui http: // stackoverflow. it/questions/13783295/ottenere-tutti-nomi-in-un-enum-come-una-stringa –

+0

OK scusate, probabilmente ho frainteso: ho pensato che sarebbe stato possibile creare un messaggio di errore predefinito generico, e all'interno stampare tutte le valori enum generici., – membersound

9

@NotBlank

Convalida che la stringa annotato non è nullo o vuoto. La differenza con NotEmpty è che gli spazi vuoti finali vengono ignorati.

Dove come UserRole non è String e un object Uso @NotNull

L'elemento annotato non deve essere nulla. Accetta qualsiasi tipo

Problemi correlati