Hibernate Validator布尔逻辑

And*_*708 1 java validation hibernate-validator bean-validation

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

@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 { };
}
Run Code Online (Sandbox Code Playgroud)

使用这种@PatternOrSize验证约束意味着输入字符串或者小写具有2和3之间的尺寸现在,这引发了几个问题:

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

先感谢您.

Gun*_*nar 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();
}
Run Code Online (Sandbox Code Playgroud)