如何使用javax.validation验证值列表?

50

有没有一种方法可以使用javax.validation对名为color的字符串类型变量进行验证,只需要具有这些值(红色,蓝色,绿色,粉色)?

我已经看到了@size(min=1, max=25)@notnull,但是否有类似于这个@In(red, blue, green, pink)的东西?

与在mysql中使用的In关键字相似。


嗨。我猜这不可能使用javax验证器,那么我可以在表/数据库级别上创建一个约束吗? - Jono
4个回答

120

在这种情况下,我认为使用@Pattern注释会更简单,并且可以像下面的代码片段一样。如果你想进行大小写不敏感的评估,只需添加相应的标志:

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


2
如果红色、蓝色等是一个常量,会怎样? - user666
2
它是否允许空值? - Lucke
@user666,你有没有找到使用Pattern注释在正则表达式中使用常量的解决方案?例如:AppConstants.RED,AppConstants.BLUE等。 - Devika Balasubramanian

12

您可以创建自定义验证注释。我将在此处编写它(未经测试的代码!):

@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
    }

}

2
当尝试验证字符列表时非常有用,但您无法将“值”定义为对象数组。编译器会给出以下错误:“注释属性In.values的类型无效:只允许基本类型、字符串、类、注释、枚举或其1维数组。” - maureyes

3
您可以创建一个枚举。
public enum Colors {
    RED, PINK, YELLOW
}

然后在您的模型中,您可以像这样验证它:

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

如果您在RestController中添加了@Valid注解,它将根据枚举验证您的有效载荷。


8
不是这样的。@Enumerated 是 javax.persistence 的注解,而不是 javax.validation 的注解。 - ccleve

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接