Вложенные аннотации Jsr 303

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

@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 ответ

Я нашел шаблон в спецификации 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")
  })
Другие вопросы по тегам