2017-06-07 1 views
-1

ich für eine Art und Weise bin auf der Suche Validierung Einschränkung angeben, die zum Beispiel Alternativen erlaubt:Alternativen in Java-Validierung Anmerkungen Geben Sie

@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 {}; 
} 

Ist es möglich, Java-Validator-Tools?

+1

In Ihrem Fall kann Ihr regulärer Ausdruck es abdecken: '@Pattern (regexp ="^| (\\ s | \\ d | [- +:()]) {6,20} $ ")' Nein Notwendigkeit für '@ Size'. – VGR

Antwort

0

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.

+1

So wird "@ Size" in Bean Validation 2.0 "@ Repeatable" sein (also für HV 6), aber jetzt können Sie den 'List' Container verwenden, der mit' @ Size' verknüpft ist. Über '@ OverridesAttribute' können Sie' constraintIndex' verwenden, um es auf eine bestimmte Abhängigkeit anzuwenden. –