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?
Gibt es einen Grund, warum Sie nicht nur die enum als verwenden Feldtyp direkt? – chrylis