2012-10-31 31 views
6

Tôi muốn xác thực đối số của mình bằng chú thích Java. Tôi không phải bây giờ làm thế nào để sử dụng viết một chú thích của riêng cho danh sách.Danh sách có chú giải Java

Dưới đây là một ví dụ đơn giản:

class test{ 

    @myAnnotation 
    List<myObject> myElements =new List<>(); // validated List 
} 

class myObject{ 

     String name; 
} 

tôi Interface chú giải:

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) 
    @Retention(RetentionPolicy.RUNTIME) 
    @Constraint(validatedBy=myAnnotation_Validator.class) 
    @Documented 


public @interface myAnnotation { 
      String message() default "List is not valid"; 
      Class <?>[] groups() default {}; 
      Class <?extends Payload>[] payload() default{}; 

      String[] namen(); 
    } 

public class myAnnotation_Validator implements ConstraintValidator<myAnnotation, Collection> { 

    @Override 
    public void initialize(Kredite_List_Check a) { 
     // What to do here??? 
    } 



    @Override 
    public boolean isValid(Collection t, ConstraintValidatorContext cvc) { 
     // What to do here??? 
     // How could i get the names from my List "myElements" ? 
     return false; 
    } 

} 

Trong ví dụ này Danh sách của tôi là hợp lệ, nếu mỗi phần tử từ Danh sách của tôi có tên khác. Tôi không biết làm thế nào tôi có được listobject trong lớp Validator của tôi và tên của các phần tử myObject.

UPDATE:

tôi cố gắng để mô tả câu hỏi của tôi theo cách khác:

danh sách của tôi là không hợp lệ nếu hai yếu tố từ loại "myObject" trong danh sách của tôi ("myElements") có cùng tên!

Làm cách nào tôi có thể nhận ra điều này bằng Chú thích?

+0

Có lý do cụ thể nào để chọn chú thích trên một số danh sách được trang trí không? –

+0

bạn đã xem http://stackoverflow.com/questions/7865209/how-to-create-a-constraintvalidator-for-list –

Trả lời

2
public class myAnnotation_Validator implements ConstraintValidator<myAnnotation, Collection> { 
    private String[] names; 

    @Override 
    public void initialize(myAnnotation a) { 
     //get values which are defined in the annotation 
     names = myAnnotation.namen(); 
    } 

    @Override 
    public boolean isValid(Collection objectToValidate, ConstraintValidatorContext cvc) { 

     if(objectToValidate == null) return true; // use the @NotNull annotation for null checks 

     for(Object o : objectToValidate) { 
      //check if value is valid 
     } 

     return false; 
    } 
} 

Trong phương thức khởi tạo bạn có thể nhận các giá trị, được định nghĩa trong chú thích. Phương thức isValid được sử dụng để xác thực đối tượng (objectToValidate -> đối tượng danh sách của bạn).

Để biết thêm thông tin về làm thế nào để viết một validator tùy chỉnh thấy http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

Ngoài việc thực hiện Hibernate-Validator là một tài liệu tham khảo tốt. https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

Tôi hy vọng câu trả lời này sẽ giúp bạn.

0

Tôi có thể trả lời câu hỏi của bạn một phần, bạn có thể lấy tên từ bộ sưu tập được gửi làm thông số trong phương thức isValid của bạn. Lặp lại bộ sưu tập của bạn (trong trường hợp của bạn là một danh sách).

@Override 
public boolean isValid(Collection t, ConstraintValidatorContext cvc) { 
    // Iterate your Collection t to get the names. 
    return false; 
} 
+0

điều này không hoạt động, bởi vì đối tượng thử nghiệm của tôi không được trả trước – JavaNullPointer

+0

ý của bạn là gì "đối tượng thử nghiệm của tôi không có sẵn". Con đường để đi là lặp lại bộ sưu tập được truyền cho bạn. Đây là bộ sưu tập bạn đã đặt chú thích ràng buộc tùy chỉnh trên, aka _myElements_. – Hardy

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