Как применить пользовательскую аннотацию к списку <String>? - PullRequest
3 голосов
/ 28 января 2020

Я создал аннотацию, чтобы проверить значение поля String (например, enum):

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = GenericStringSetValidator.class)
public @interface ValidStringValue {

    String message() default "Must be a valid value. Found: ${validatedValue}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String[] values() default {};
}

И GenericStringSetValidator, используемый аннотацией:

public class GenericStringSetValidator implements ConstraintValidator<ValidStringValue, String> {

    private Set<String> validValues;

    @Override
    public void initialize(ValidStringValue constraint) {
            validValues = Arrays.stream(constraint.values())
                    .collect(toSet());
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) return false;
        return validValues.contains(value);
    }
}

I уже используйте это в следующем классе без каких-либо проблем:

public class SampleClass{
    private String id;
    @ValidStringValue(values = {"IN_PROGRESS", "COMPLETED", "DELETED"})
    private String status;
}

Но я также хочу использовать его в другом классе с List<String> для проверки каждого элемента List. Можно ли настроить мой ValidStringValue интерфейс, чтобы он мог использоваться на String, а также на List<String>?

public class SampleClassWithList{
    private String id;
    @ValidStringValue(values = {"A", "B", "C"})
    private List<String> sampleList;
}

Большое спасибо за вашу помощь:)

...