2012-02-17 3 views
0

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

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

Я текущим образом вызываю ограничения.

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

Однако это отстой obviously.I в конечном итоге реорганизовать для запуска IsValid методы с помощью вызова метода AnnotationInvocationHandler.invoke(), но им небольшой путь от, что до сих пор.

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

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

Любые идеи?

ответ

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") 
    }) 
Смежные вопросы