0

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

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

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

有任何想法吗?

4

1 回答 1

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")
  })
于 2012-02-18T13:01:31.653 回答