必须只接受特定数值的验证器

Validator that must accept only specific numeric values

除了 javax.validation 库之外,我还使用 Hibernate Validator 来验证 Spring MVC 应用程序中控制器的请求主体。约束的注释有助于最小和最大边界以及位数,但我找不到只接受特定数字的方法。例如,如果我只想接受值 10、20 和 50 怎么办?

我知道可以使用 org.springframework.validation.Validator 界面来创建更复杂的规则。我想到的另一件事是创建一个具有所需数值的枚举,但这似乎不是一个干净的解决方案。我很想知道是否有更好、更简单的方法来实现我想要的。

您可以按照 Hibernate Validator reference guide 中深入描述的方式实现自定义 Bean Validation 约束。我建议使用可接受的数值数组而不是枚举:

@OneOf({ 10, 20, 50 })
int myInt;

您可以创建自己的接受多个值的注释。这涉及编写注释 class 和验证器 class:

public class OneOfValidator implements ConstraintValidator<OneOf, Integer> {}

以及注释:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = OneOfValidator.class)
public @interface OneOf {
    String message() default "value must match one of the values in the list";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    int[] value() default {};
}

然后您可以像这样使用它:

@OneOf({2, 3, 5, 9})