Вложенные аннотации Jsr 303 для проверки - PullRequest
0 голосов
/ 18 февраля 2012

Я хотел бы использовать ограничение на уровне класса.Однако я не могу получить внутренние ограничения для проверки автоматически.Я хотел бы помочь с одной частью, чтобы включить группы проверки в эту технику.

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

Я временно запускаю ограничения, как это.

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

Однако это отстой, очевидно.в конечном итоге будет произведен рефакторинг для запуска методов isValid через вызов метода AnnotationInvocationHandler.invoke (), но я немного отошел от этого.

Моя проблема в том, что все экземпляры ConstraintB передаются в мой ConstraintA.Я желаю, чтобы только те с соответствующими группами были переданы ConstraintA.Я сомневаюсь, что эта возможность существует, так как я могу определить, какие группы нужно запускать, а какие нет?

Я не вижу в своей отладке каких-либо объектов, которые указывают, какие группы следует запускать?

Есть идеи?

1 Ответ

0 голосов
/ 18 февраля 2012

Я нашел шаблон в спецификации 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")
  })
...