我正在考虑使用布尔逻辑和我的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之间。现在这引发了一些问题:
AND
和OR
?我找不到任何暗示这是可能的事情,但也许我错过了一些东西。@Pattern
和@Size
约束的参数动态化?因为否则我想我必须为我需要的每个参数组合定义一个新的注释。仅仅将参数更改为@Size
来定义新注释似乎不可行,但可能是必要的?提前谢谢。
答案 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();
}