2017-12-18 6 views
0

Ich versuche, eine benutzerdefinierte Annotation zu schreiben, die eine String gegen eine spezifische Enum validiert. Ich benutze Hibernate Validator API. Der gewünschte Anwendungsfall würde wie folgt aussehen.Angepasste Annotation, um die Zeichenfolge für den Aufzählungstyp zu validieren

@MessageTypeOf(MessageType.NETWORK) 
private String message; 

The String sollte aus dem toString() Verfahren der ENUM gegeben als ENUM Argument (in diesem Fall MessageType.NETWORK) gegeben gegen den Wert validiert.

Ich habe einen Validator geschrieben und sieht so aus.

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

Und die Anmerkung.

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

Dies würde jedoch validieren, wenn ein String-Teil des ENUM (beliebiger Wert) ist, wo, wie I gegen einen spezifischen validieren muss. Könnte jemand vorschlagen, wie man das macht?

+0

Gibt es einen Grund, warum Sie nicht nur die enum als verwenden Feldtyp direkt? – chrylis

Antwort

1

Also, im Grunde wäre der einzige gültige Wert der Eigenschaft MessageType.NETWORK.toString(), ist das richtig? Das ist ziemlich seltsam (erwartet, dass der Client eine Zeichenfolge bereitstellt, die nur einen gültigen Wert haben kann), aber Sie müssen nur Folgendes überprüfen:

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