我在实现自己的验证注释方面遇到了一些问题。
以下是示例代码:
@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
(我实现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 {
...
}
答案 0 :(得分:-1)
尝试添加@ReportAsSingleViolation批注。根据规范:
“更具体地说,如果组合约束被标记为@ReportAsSingleViolation,则组合约束的评估在第一个失败约束处停止,并且生成并返回与组合约束相对应的错误报告。”
http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation-constraintcomposition
答案 1 :(得分:-1)
answer只是部分正确。是 @ReportAsSingleViolation ,在这种情况下,首次发生故障后,只会生成一次违规并且验证将停止。但是,规范不保证评估订单约束。它可能是首先是组合约束,也可能是通过 @Constraint 指定的验证器。如果有的话,你会依赖一些可能随时改变的实现细节。此外,没有定义评估 @Size 和 @Pattern 的顺序。最重要的是,您无法通过约束组合实现您想要的行为。
如果要保证顺序执行,则需要查看 GroupSequence 功能。