我正在寻找一种方法来指定允许替代的验证约束,例如:
@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Pattern(regexp = "^(\\s|\\d|[-+:()])*$")
@Or( // I'm looking for something like this
@Size(min = 6, max = 20),
@Size(min = 0, max = 0)
)
public @interface Phone {
String message() default "Not a valid phone number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
是否可以使用java验证工具?
答案 0 :(得分:0)
我找到了一个涉及创建多个中间注释并使用@ConstraintComposition(CompositionType.OR)
的解决方案,但也许有人会提出更好的解决方案。
首先,为替代的单个分支创建注释:
@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Size(max = 0)
public @interface Empty {
String message() default "Should be empty string";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
其次,创建另一个注释,将自定义注释与另一个分支组合在一起:
@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@ConstraintComposition(CompositionType.OR)
@Size
@Empty
public @interface SizeOrEmpty {
String message() default "Should be empty or have defined size";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@OverridesAttribute(constraint = Size.class, name = "min") int min();
@OverridesAttribute(constraint = Size.class, name = "max") int max();
}
不幸的是,您不能使用两个@Size注释,因为它不是@Repeatable注释,其次,您不能使用@OverridesAttribute仅覆盖其中一个属性。