Javax验证 - 约束组合

时间:2014-03-20 19:29:19

标签: bean-validation hibernate-validator

我在实现自己的验证注释方面遇到了一些问题。

以下是示例代码:

@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 {
    ...
}

2 个答案:

答案 0 :(得分:-1)

尝试添加@ReportAsSingleViolation批注。根据规范:

“更具体地说,如果组合约束被标记为@ReportAsSingleViolation,则组合约束的评估在第一个失败约束处停止,并且生成并返回与组合约束相对应的错误报告。”

http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation-constraintcomposition

答案 1 :(得分:-1)

answer只是部分正确。是 @ReportAsSingleViolation ,在这种情况下,首次发生故障后,只会生成一次违规并且验证将停止。但是,规范不保证评估订单约束。它可能是首先是组合约束,也可能是通过 @Constraint 指定的验证器。如果有的话,你会依赖一些可能随时改变的实现细节。此外,没有定义评估 @Size @Pattern 的顺序。最重要的是,您无法通过约束组合实现您想要的行为。

如果要保证顺序执行,则需要查看 GroupSequence 功能。