2013-08-13 7 views

Antwort

28

Hinweis: Sie können auch einen Validator erstellen, um zu überprüfen, ob ein String Teil einer Enumeration ist.

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

} 

Das ist schön, weil Sie nicht die Information des "falschen Wert" verlieren. Sie erhalten eine Nachricht wie

Der Wert "someBadUserType" ist kein gültiger UserType. Gültige Usertype Werte sind: PERSON, FIRMA


bearbeiten

Für diejenigen, die eine nicht-Guava Version wollen sie mit so etwas wie funktionieren sollte:

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

} 

Und Passen Sie die Fehlermeldung an und zeigen Sie die entsprechenden Werte an. Überprüfen Sie Folgendes: https://stackoverflow.com/a/19833921/82609

+0

Wie soll das ohne die Guava-Funktionen geschrieben werden? – membersound

+1

@Membersound wirklich gibt es überhaupt keine Komplexität dabei. Sie müssen nur ein enum-Array ('enumSelected.getEnumConstants()' in einen Satz von Enum-Namen umwandeln ('AVAILABLE_ENUM_NAMES') und Sie finden leicht Tutorials, um das mit Java zu machen :) siehe http: // stackoverflow. com/questions/13783295/getting-all-Namen-in-einem-enum-as-a-String –

+0

OK Entschuldigung, wahrscheinlich habe ich falsch verstanden: Ich dachte, es wäre möglich, eine generische Standard-Fehlermeldung zu erstellen, und im Inneren alle drucken generische Enum-Werte., – membersound

9

@NotBlank

Validate, dass die kommentierten String nicht null oder leer ist. Der Unterschied zu NotEmpty besteht darin, dass nachfolgende Leerzeichen ignoriert werden.

Wo, wie UserRole ist nicht String und ein object Verwenden @NotNull

Das kommentierte Element nicht Null sein muss. Akzeptiert jeden Typ.