Подтвердить что ты не робот

Javax.validation для проверки списка значений?

Есть ли способ использовать javax.validation для проверки переменной строки типа, называемой цветом, которая должна иметь только эти значения (красный, синий, зеленый, розовый) с помощью аннотаций?

Я видел @size (min = 1, max = 25) и @notnull, но есть ли что-то вроде этого @In (красный, синий, зеленый, розовый)

более или менее похоже на ключевое слово "В", используемое в mysql

4b9b3361

Ответ 1

В этом случае я думаю, что было бы проще использовать аннотацию @Pattern, например, сниппет ниже. Если вам нужна оценка без учета регистра, просто добавьте соответствующий флаг:

@Pattern(regexp = "red|blue|green|pink", flags = Pattern.Flag.CASE_INSENSITIVE)

Ответ 2

Вы можете создать пользовательскую аннотацию проверки. Я напишу его здесь (непроверенный код!):

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = InConstraintValidator.class)
public @interface In
{
    String message() default "YOURPACKAGE.In.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default {};

    Object[] values(); // TODO not sure if this is possible, might be restricted to String[]
}

public class InConstraintValidator implements ConstraintValidator<In, String>
{

    private Object[] values;

    public final void initialize(final In annotation)
    {
        values = annotation.values();
    }

    public final boolean isValid(final String value, final ConstraintValidatorContext context)
    {
        if (value == null)
        {
            return true;
        }
        return ...; // check if value is in this.values
    }

}

Ответ 3

вы можете создать перечисление

public enum Colors {
    RED, PINK, YELLOW
}

а затем в вашей модели вы можете проверить его так:

public class Model {
    @Enumerated(EnumType.STRING)
    private Colors color;
}

который будет проверять вашу полезную нагрузку против перечисления, учитывая, что вы добавили @Valid в вашем RestController.