2012-10-31 12 views
6

Chcę sprawdzić poprawność moich argumentów za pomocą adnotacji Java. Nie wiem teraz, jak używać własnych adnotacji do list.Listy z adnotacjami Java

tutaj jakiś prosty przykład:

class test{ 

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

class myObject{ 

     String name; 
} 

mój Adnotacja Interfejs:

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

} 

W tym przykładzie mojej liście jest ważna, jeśli każdy element z mojej listy ma inną nazwę. Nie wiem, jak uzyskać listę obiektów w mojej klasie Validator i nazwach elementów myObject.

UPDATE:

próbuję opisać moje pytanie w inny sposób:

moja lista nie jest ważne, jeśli dwa elementy z typu „MyObject” W mojej liście („myElements”) mają taką samą nazwę!

Jak mogę to zrozumieć za pomocą adnotacji?

+0

Czy istnieje jakiś konkretny powód, aby wybrać adnotacje nad niektórymi udekorowanymi listami? –

+0

patrzysz na http://stackoverflow.com/questions/7865209/how-to-create-a-strastraimulatorator- for-list –

Odpowiedz

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

W metodzie initialize można uzyskać wartości, które są zdefiniowane w adnotacji. Metoda isValid służy do sprawdzania poprawności obiektu (objectToValidate -> Twój obiekt listy).

Aby uzyskać więcej informacji o tym, jak napisać niestandardowy walidator zobaczyć http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

także realizacja Hibernate-Validator jest dobre referencje. https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

Mam nadzieję, że ta odpowiedź pomoże.

0

Mogę częściowo odpowiedzieć na twoje pytanie, możesz pobrać nazwy z kolekcji, która jest wysyłana jako parametr w twojej metodzie isValid. Iteruj swoją kolekcję (która w twoim przypadku jest listą).

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

to nie działa, ponieważ mój obiekt testowy nie jest dostępny – JavaNullPointer

+0

co masz na myśli "mój obiekt testowy nie jest dostępny". Aby przejść, należy powtórzyć otrzymaną kolekcję. Jest to kolekcja, w której umieściłeś adnotację z ograniczeniem niestandardowym, zwaną także _myElements_. – Hardy

Powiązane problemy