【问题标题】:Javax validation - constraint compositionJavax 验证 - 约束组合
【发布时间】:2014-03-20 19:29:19
【问题描述】:

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

这里是示例代码:

@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 注释提供的验证器(@ 987654325@)。

简单地说:

  • 只有当@Pattern@Size 有效时,我才想运行SampleValidator

(我将 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 {
    ...
}

【问题讨论】:

    标签: bean-validation hibernate-validator


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢哈代,您的回复。我不认为“GroupSequence”是一个合适的解决方案(我确实考虑过使用它),但注释的问题是:“Constraint”注释中没有“groups”属性。 'GroupSequence' 在'Pattern'/'Size'(这两个具有'groups'属性)验证顺序的情况下很有用,但在Size/Constraint order 中没有。
      • 我不太明白你在说什么。所有约束都支持 group 属性。根据 Bean 验证规范,组属性是必需的。到目前为止,GroupSequences 是 Bean Validation 中强制执行验证顺序的唯一方法。其他任何事情都将依赖于一些 Bean Validation 提供程序内部。
      • 我在帖子中添加了一些额外的行来描述我的观点。问候:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多