hibernate验证器- Javax验证-约束组合



我在正确实现我自己的验证注释时遇到了一点问题。

下面是示例代码:

@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特性。

最新更新