2013-04-25 11 views
12

I próbowano zastosować wiele @Pattern adnotacje na jednym polu:Wiele Regex @ Pattern's dla 1 pola?

@Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit.") 
@Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter.") 
@Pattern(regexp = "(?=.*[A-Z])", message = "Password must contain one uppercase letter.") 
@Pattern(regexp = "(?=\S+$)", message = "Password must contain no whitespace.") 
private String password; 

Niestety, nie mogę tego zrobić. Chcę pojedynczych wiadomości na naruszenie ograniczenia regex w polu hasła. czy to możliwe?

Moją alternatywą jest użycie tagów JSF 2.0 f: validatorRegex.

+0

Można utworzyć własną adnotacji walidacji –

Odpowiedz

28

Można użyć wewnętrzną @List adnotacji @Pattern:

@Pattern.List({ 
    @Pattern(regexp = "(?=.*[0-9])", message = "Password must contain one digit."), 
    @Pattern(regexp = "(?=.*[a-z])", message = "Password must contain one lowercase letter."), 
    @Pattern(regexp = "(?=.*[A-Z])", message = "Password must contain one uppercase letter."), 
    @Pattern(regexp = "(?=\\S+$)", message = "Password must contain no whitespace.") 
}) 
private String password; 
+0

to nie działa dla mnie nie wiem sposób, ale coś jest nie tak –

+0

regex nie działa (JDK 8), Rozwiązanie Ganov13 działa jednak. – eav

+0

Należy zauważyć, że od wersji Bean Validation 2.0 (i Hibernate Validator 6) '@ Pattern' będzie powtarzalnym ograniczeniem, tzn. Może być podana kilka razy bez wyraźnej adnotacji" List ". – Gunnar

2

Może zajrzeć do kompozycji więzów. Zbudowałbyś jedną adnotację na ograniczenie haseł złożone z adnotacji @Pattern, a następnie w końcu stworzysz jedną skomponowaną adnotację, używając wcześniej zdefiniowanej czwórki. Nie wymagałoby to dodatkowego kodu java.

http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#validator-customconstraints-compound

przeciwnym razie zbudować (z towarzyszącym kod Java) niestandardowego adnotacji o nazwie @PasswordValidator.

Ja lubię składane walidatory, ponieważ cel przypisów walidacyjnych jest jasny i jasny, a nie mają wiele rozłącznych adnotacji.

2

I zmodyfikowane Gunnar odpowiedź i napisać kompozytowy ograniczenie, a to wydaje się działać poprawnie na 4 testów jednostkowych:

@NotNull 
@Size(min=6, max=45) 
@Pattern.List({ 
    @Pattern(regexp = "(?=.*[0-9]).+", message = "Password must contain one digit."), 
    @Pattern(regexp = "(?=.*[a-z]).+", message = "Password must contain one lowercase letter."), 
    @Pattern(regexp = "(?=.*[A-Z]).+", message = "Password must contain one uppercase letter."), 
    @Pattern(regexp = "(?=.*[[email protected]#$%^&*+=?-_()/\"\\.,<>~`;:]).+", message ="Password must contain one special character."), 
    @Pattern(regexp = "(?=\\S+$).+", message = "Password must contain no whitespace.") 
}) 
@Constraint(validatedBy = {}) // constraints composition 
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface StrongPassword { 

    String message() default "Password doesn't match bean validation constraints."; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 
2

rozwiązania Gunnara nie zadziała dla mnie ... ". +" w jego wyglądzie brakuje. Używam jednak wzorca listy Michała i działa to dla mnie jak urok. (Play 2.3.x/Ebean-ORM)

@Pattern.List({ 
     @Pattern(regexp = "(?=.*[0-9]).+", message = "Password must contain one digit."), 
     @Pattern(regexp = "(?=.*[a-z]).+", message = "Password must contain one lowercase letter."), 
     @Pattern(regexp = "(?=.*[A-Z]).+", message = "Password must contain one upper letter."), 
     @Pattern(regexp = "(?=.*[[email protected]#$%^&*+=?-_()/\"\\.,<>~`;:]).+", message ="Password must contain one special character."), 
     @Pattern(regexp = "(?=\\S+$).+", message = "Password must contain no whitespace.") 
}) 
@Constraints.Required() 
public String password1;