2012-10-31 74 views
6

我想使用Java註釋驗證我的參數。我現在不用如何使用爲列表編寫自己的註釋。使用Java註釋列表

這裏一個簡單的例子:

class test{ 

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

class myObject{ 

     String name; 
} 

我的註釋界面:

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

} 

在本實施例我的列表是有效的,如果從我的列表中的每個元素有另一個名稱。我不知道如何在我的Validator類和myObject-elements的名稱中獲得listobject。

UPDATE:

我試圖描述以另一種方式,我的問題:

我的名單是不是有效的,如果從類型「myObject的」兩個元素在我的名單(「myElements」)具有相同的名字!

我怎麼能認識到這與註釋?

+0

是否有任何具體的理由選擇一些裝飾列表的註釋? –

+0

你看過http://stackoverflow.com/questions/7865209/how-to-create-a-constraintvalidator-for-list –

回答

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

在初始化方法,你可以得到的值,這是在註釋中定義。 isValid方法用於驗證對象(objectToValidate - >您的列表對象)。

有關如何編寫自定義的驗證見http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

更多信息還Hibernate的驗證器的實現是一個很好的參考。 https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

我希望這個答案能幫助你。

0

我可以部分回答你的問題, 你可以從你的isValid方法中作爲參數發送的集合中獲得名稱。迭代你的收藏(在你的情況下是一個列表)。

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

這不起作用,因爲我的測試對象不可用 – JavaNullPointer

+0

你是什麼意思「我的測試對象不可用」。要走的路是迭代傳遞給你的集合。這是您放置自定義約束註釋的集合,又名_myElements_。 – Hardy