【问题标题】:Validator that must accept only specific numeric values必须只接受特定数值的验证器
【发布时间】:2017-07-10 18:03:42
【问题描述】:

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

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

【问题讨论】:

    标签: java spring validation user-input hibernate-validator


    【解决方案1】:

    您可以创建自己的注释来接受多个值。这涉及到编写一个 Annotation 类和一个 Validator 类:

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

    【讨论】:

    • 从@Gunnar 复制了好名字OneOf :)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2021-12-24
      • 2016-12-14
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      相关资源
      最近更新 更多