我在正确实现我自己的验证注释时遇到了一点问题。
下面是示例代码:
@Pattern(regexp="[0-9]*")
@Size(min=3, max=10)
@Constraint(validatedBy = SampleValidator.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface MyAnnotation {
String message() default "Wrong!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
MyAnnotation[] value();
}
}
我的问题是,我希望我的注释以这样的方式工作,即@Size
和@Pattern
注释首先运行,如果它们是有效的,那么(并且只有这样)运行由@Constraint
注释(SampleValidator.class
)提供的验证器。
简单点说:
- 我想运行
SampleValidator
只有当@Pattern
和@Size
是有效的
(I实现了SampleValidator作为附加的验证器,只在某些特定情况下调用)
我怎样才能获得这样的行为?提前感谢!
显然,我不能那样做:
@GroupSequence({ Step1.class, Step2.class })
@Constraint(validatedBy = SampleValidator.class, groups = Step1.class) // no 'groups' attribute
@Size(min=3, max=10, groups = Step2.class)
@Pattern(regexp="[0-9]*", groups = Step2.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface MyAnnotation {
...
}
尝试添加@ReportAsSingleViolation注释。按规格:
"更具体地说,如果组合约束被标记为@ReportAsSingleViolation,那么组合约束的求值将在第一个失败约束处停止,并且生成并返回与组合约束对应的错误报告。"
http://beanvalidation.org/1.1/spec/constraintsdefinitionimplementation-constraintcomposition
答案只部分正确。Yes @ReportAsSingleViolation在这种情况下,只会生成一个单独的违规,并且在第一次失败后验证将停止。然而,该规范并不能保证在何种情况下评估订单约束。它可以是组合约束,也可以是通过@Constraint指定的验证器。如果有的话,你会依赖于一些随时可能改变的实现细节。此外,也没有定义@Size和@Pattern的计算顺序。底线是,你不能用约束组合实现你想要的行为。
如果您想保证顺序执行,您需要查看GroupSequence特性。