Вложенные аннотации 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")
})