Ich habe eine Lösung gefunden, die das Erstellen mehrerer Zwischenanmerkungen und die Verwendung von @ConstraintComposition(CompositionType.OR)
beinhaltet, aber vielleicht wird jemand eine bessere Lösung vorschlagen.
Also, zuerst, Annotation für einzelnen Zweig der Alternative zu schaffen:
@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 {};
}
Zweitens eine andere Anmerkung erstellen, die Ihre benutzerdefinierte Anmerkung mit einem anderen Zweig kombiniert:
@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();
}
Leider kann man nicht verwenden zwei @Size-Annotationen, da es sich nicht um eine @ Repeatable-Annotation handelt, und zweitens können Sie Attribute von nur einer davon nicht mit @OverridesAttribute überschreiben.
In Ihrem Fall kann Ihr regulärer Ausdruck es abdecken: '@Pattern (regexp ="^| (\\ s | \\ d | [- +:()]) {6,20} $ ")' Nein Notwendigkeit für '@ Size'. – VGR