嵌套的Jsr 303验证注释

时间:2012-02-17 21:56:34

标签: annotations nested constraints invocationhandler

我想使用类级注释约束。但是,我无法获得自动验证的内部约束。我想帮助一个部分,将验证组纳入这项技术。

@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。我怀疑这种能力是否存在,那么如何确定哪些群体需要被触发以及哪些群体不需要?

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在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")
  })