我想使用类级注释约束。但是,我无法获得自动验证的内部约束。我想帮助一个部分,将验证组纳入这项技术。
@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。我怀疑这种能力是否存在,那么如何确定哪些群体需要被触发以及哪些群体不需要?
我在调试中没有看到任何指定应该触发哪些组的对象?
有什么想法吗?
答案 0 :(得分: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")
})