2013-04-25 20 views
12

Tôi đã cố gắng áp dụng nhiều chú thích @Pattern đến một lĩnh vực duy nhất:Nhiều mẫu của Regex @ cho 1 trường?

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

Tuy nhiên, tôi không thể làm điều này. Tôi muốn các thông báo riêng lẻ mỗi vi phạm ràng buộc regex trên trường mật khẩu. Điều này có thể không?

Cách thay thế của tôi là sử dụng thẻ JSF 2.0 f: validatorRegex.

+0

Bạn có thể tạo xác nhận của bạn chú thích riêng –

Trả lời

28

Bạn có thể sử dụng bên trong @List chú thích của @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

nó không làm việc cho tôi, tôi không biết cách nhưng có cái gì đó sai –

+0

regex không hoạt động (jdk 8), Giải pháp của Ganov13 hoạt động. – eav

+0

Lưu ý rằng khi Bean Validation 2.0 (và Hibernate Validator 6), '@ Pattern' sẽ là một ràng buộc lặp lại, tức là nó có thể được cung cấp nhiều lần mà không có chú thích' List' rõ ràng. – Gunnar

2

Bạn có thể muốn xem xét thành phần ràng buộc. Bạn sẽ xây dựng một chú thích cho mỗi ràng buộc mật khẩu được tạo từ chú thích @Pattern, và sau đó cuối cùng xây dựng một chú thích được soạn thảo bằng cách sử dụng bốn định nghĩa đã được xác định trước đó. Điều này sẽ không yêu cầu thêm mã java.

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

Nếu không, xây dựng (đi kèm với mã java) một chú thích tùy chỉnh được gọi @PasswordValidator.

Tôi có xu hướng thích trình xác nhận hợp lệ, vì nó làm cho mục đích của các chú thích xác thực rõ ràng về mục đích của chúng, thay vì có nhiều chú thích phân tách.

2

tôi sửa đổi Gunnar câu trả lời và viết hạn chế tổng hợp và điều này bây giờ có vẻ để làm việc một cách chính xác vào ngày 4 kiểm tra đơn vị:

@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

giải pháp Gunnar của sẽ không làm việc cho tôi ... '. +' trong regexp của mình dường như bị mất tích. Tuy nhiên, tôi đang sử dụng patternList của Michal và nó hoạt động như một sự quyến rũ đối với tôi. (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;