2011-12-06 24 views
7

Tôi muốn đặt một số ràng buộc standart (như không phải chuỗi rỗng và số có chiều dài từ 3 đến 240 ký tự) trên các trường (Chuỗi trong trường hợp này) và muốn biết là có cách ghi đè của ràng buộc này trong mã mô hình. Ngoài ra, đây có phải là trọng tâm hay chỉ xác thực hai lần cho chú thích ghi đè?JSR 303 Ghi đè ràng buộc tùy chỉnh

nó phải được một cái gì đó như thế này

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

nhờ cho bạn câu trả lời

ok, trả lời bản thân mình. có @OverridesParameter Mà giúp gán tham số chú thích lồng nhau

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

Trả lời

5

Đó là một câu hỏi tốt đẹp. JSR 303 Bean Validation specification mô tả quy trình xác thực trong phần 3.5.

Đối với một nhóm được xác nhận, thói quen xác nhận áp dụng trên dụ đậu được dự kiến ​​sẽ thực hiện các hạn chế sau kiểm chứng thực không theo thứ tự đặc biệt:

  • cho tất cả các lĩnh vực thể truy cập, thực hiện tất cả xác nhận mức trường (bao gồm các giá trị được biểu thị trên các lớp bậc trên) phù hợp với nhóm được nhắm mục tiêu trừ khi ràng buộc xác thực đã cho là đã được xử lý trong quá trình xác thực này cho một đường dẫn điều hướng nhất định (xem Phần 3.5.1) như một phần của nhóm phù hợp.

...

Những thói quen xác nhận đối tượng được mô tả như vậy. Đối với mỗi khai chế:

  • xác định cho việc khai báo hạn chế, các ConstraintValidator thích hợp để sử dụng (xem Phần 3.5.3).
  • thực hiện các hoạt động isValid (từ việc thực hiện xác nhận hạn chế) trên các dữ liệu thích hợp (xem phần 2.4)
  • nếu isValid trả về true, tiếp tục hạn chế tiếp theo,
  • nếu isValid trả về false, nhà cung cấp populates Bean Validation ConstraintViolation object (s) theo các quy tắc được xác định trong Mục 2.4 và gắn các đối tượng này vào danh sách các vi phạm ràng buộc.

Trong trường hợp của bạn, bạn đối phó với xác nhận của một String lĩnh vực đơn giản mà nhóm nhắm mục tiêu là Default. Bạn có hai ràng buộc xác nhận (@AlphanumericString và @Size) mà theo tài liệu sẽ được xác nhận/xử lý riêng biệt không theo thứ tự cụ thể.

Vì vậy, để trả lời câu hỏi của bạn. Không, sẽ không có ghi đè nào được áp dụng cho số @AlphanumericString của bạn khi bạn sử dụng số @Size bổ sung.Để có thể đạt được những gì tôi nghĩ bạn cố gắng làm, bạn có thể tạo ra một thành phần chế nơi bạn overridde thuộc tính từ chú thích sáng tác như thế:

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

và sử dụng nó như thế:

@AlphanumericString(min = 100, max = 150) 
+0

Cảm ơn, đã tìm ra phương pháp này, bạn có thể gợi ý cho tôi một cách để tăng tốc quá trình xác nhận, không phải là việc xác thực nhà máy xác thực chỉ một lần cho mỗi ứng dụng, chia xác thực thành nhóm và sắp xếp chúng từ thời gian xử lý nhanh hơn đến chậm hơn? – Pilgrim

Các vấn đề liên quan