Я создаю Validator, который проверяет строку на соответствие перечислению на основе Раздела 5 https://www.baeldung.com/javax-validations-enums
У меня работает следующий код
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ValueOfStringEnumValidator.class)
public @interface ValueOfStringEnum {
Class<? extends Enum<?>> enumClass();
String message() default "must be any of enum {enumClass}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ValueOfStringEnumValidator implements ConstraintValidator<ValueOfStringEnum, CharSequence> {
private List<String> allowedValues;
@Override
public void initialize(ValueOfStringEnum annotation) {
allowedValues = Stream.of(annotation.enumClass().getEnumConstants())
.map(Enum::name)
.collect(Collectors.toList());
}
@Override
public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return allowedValues.contains(value.toString());
}
}
Далее я хотел бы изменить сообщение так, чтобы текст детализировал значения Enum, а не выводил имя класса Enum. Любые указатели будут оценены.