Hibernate Validator布尔逻辑

时间:2015-02-17 10:57:27

标签: java validation bean-validation hibernate-validator

我正在考虑使用布尔逻辑和我的bean验证使用Hibernate Validator在AND约束不足的情况下。我发现可以通过创建@ConstraintComposition注释为described in the documentation的新注释来更改此默认行为。该文档提供了以下示例。

@ConstraintComposition(OR)
@Pattern(regexp = "[a-z]")
@Size(min = 2, max = 3)
@ReportAsSingleViolation
@Target({ METHOD, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = { })
public @interface PatternOrSize {
    String message() default "{org.hibernate.validator.referenceguide.chapter11." +
            "booleancomposition.PatternOrSize.message}";

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

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

使用此@PatternOrSize验证约束意味着输入字符串 小写的大小介于2和3之间。现在这引发了一些问题:

  • 相信必须创建一个新的注释来更改默认的布尔逻辑行为。它是否正确?如果可以在类字段中定义布尔逻辑,那将非常好,但可能不可能?
  • 是否可以进一步自定义布尔逻辑行为,而无需创建自定义验证器,例如同时定义ANDOR?我找不到任何暗示这是可能的事情,但也许我错过了一些东西。
  • 最重要的是:是否可以使@Pattern@Size约束的参数动态化?因为否则我想我必须为我需要的每个参数组合定义一个新的注释。仅仅将参数更改为@Size来定义新注释似乎不可行,但可能是必要的?

提前谢谢。

1 个答案:

答案 0 :(得分:5)

  

我相信必须创建一个新的注释来更改默认的布尔逻辑行为。这是对的吗?

是的,这是对的。

  

是否可以进一步自定义布尔逻辑行为,而无需创建自定义验证器,例如同时定义AND和OR?

您可以尝试创建一个分层组合的约束(即由其他约束组成的约束),它在不同的级别使用AND和OR。我没有尝试过(我认为我们没有对它进行过测试),但这可能值得一试。但是,根据所需的布尔逻辑,它可能不适合您的用例。

  

是否可以使@Pattern和@Size约束的参数动态化?

是的,您可以通过@OverridesAttribute

执行此操作
@ConstraintComposition(OR)
@Pattern(regexp = "[a-z]")
@Size(min = 2, max = 3)
@ReportAsSingleViolation
@Target({ METHOD, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = { })
public @interface PatternOrSize {

    String message() default "...";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };

    @OverridesAttribute(constraint=Size.class, name="min")
    int min() default 0;

    @OverridesAttribute(constraint=Size.class, name="max")
    int max() default Integer.MAX_VALUE;

    @OverridesAttribute(constraint=Pattern.class, name="regexp")
    String regexp();
}