【问题标题】:Nested Jsr 303 validation annotations嵌套的 Jsr 303 验证注解
【发布时间】:2012-02-17 21:56:33
【问题描述】:

我想使用类级别的注释约束。但是我无法让内部约束自动验证。我想提供一个帮助,将验证组整合到这项技术中。

@ConstraintA({
  @ConstraintB(stuff),
  @ConstraintB(stuff, groups=SomeGroup.class)
})
public class Form{
}

我目前像这样触发约束。

 if(constraint instanceof ConstraintB){
      new ConstraintBValidator().isValid(target, context);
 }

但这显然很糟糕。我最终会重构以通过调用 AnnotationInvocationHandler.invoke() 方法来触发 isValid 方法,但我离那还有一点点路要走。

我的问题是所有 ConstraintB 实例都传递到我的 ConstraintA 中。我希望只将具有适当组的那些传递给 ConstraintA。我怀疑这种能力是否存在,那么如何确定哪些组需要触发,哪些不需要?

我在调试中没有看到任何指定应该触发哪些组的对象?

有什么想法吗?

【问题讨论】:

    标签: annotations nested constraints invocationhandler


    【解决方案1】:

    我在 JSR 303 规范中发现了一个允许这种类型验证的模式。它是一种递归模式,不会执行父验证规则,只完成嵌套验证。这非常方便。我的嵌套验证规则有条件地基于其他属性值,因此它允许使用嵌套的 jsr303 注释进行条件验证。

     @Documented
     @Constraint(validatedBy = ZipCodeValidator.class)
     @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
     @Retention(RUNTIME)
     public @interface ZipCode {
     String countryCode();
     String message() default "{com.acme.constraint.ZipCode.message}";
     Class<?>[] groups() default {};
     Class<? extends Payload>[] payload() default {};
     /**
     * Defines several @ZipCode annotations on the same element
     * @see (@link ZipCode}
     */ 
     @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
     @Retention(RUNTIME)
     @Documented
     @interface List {
     ZipCode[] value();
     }
    

    我自己的验证更像这样:

     @RequiredIf ({
     @RequiredIf(ifField="field1", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg"),
     @RequiredIf(ifField="field2", matches={"true","somethingElse"}, requiredField="anotherField", andDisplay="error.code.msg")
      })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2011-10-30
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多