2012-10-31 11 views
6

Desidero convalidare i miei argomenti con Java Annotation. Non so come usare scrivere una propria annotazione per le liste.Elenchi con annotazioni Java

Ecco un semplice esempio:

class test{ 

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

class myObject{ 

     String name; 
} 

mia annotazione di interfaccia:

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

} 

In questo esempio il mio elenco è valido, se ogni elemento dalla mia lista ha un altro nome. Non so come ottengo il listobject nella mia classe Validator e il nome di myObject-elements.

UPDATE:

provo a descrivere la mia domanda in un altro modo:

la mia lista non è valido se due elementi di tipo "myObject" nella mia lista ("myElements") hanno lo stesso nome!

Come posso realizzare questo con Annotations?

+0

C'è qualche motivo specifico per scegliere annotazioni su qualche elenco decorato? –

+0

hai guardato http://stackoverflow.com/questions/7865209/how-to-create-a-constraintvalidator-for-list –

risposta

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

Nel metodo di inizializzazione è possibile ottenere i valori, che sono definiti nel annotazione. Il metodo isValid viene utilizzato per convalidare l'oggetto (objectToValidate -> l'oggetto elenco).

Per ulteriori informazioni su come scrivere un validatore personalizzato vedere http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

anche l'implementazione Hibernate-Validator è un buon riferimento. https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

Spero che questa risposta ti aiuti.

0

Posso rispondere parzialmente alla domanda, è possibile ottenere i nomi dalla raccolta che viene inviata come parametro nel metodo isValid. Iterate la vostra collezione (che nel vostro caso è una lista).

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

questo non funziona, perché il mio oggetto test non è disponibile – JavaNullPointer

+0

cosa intendi con "il mio oggetto di prova non è disponibile". La strada da percorrere è quella di iterare la collezione passata a te. Questa è la raccolta su cui hai inserito l'annotazione del vincolo personalizzato, ovvero _myElements_. – Hardy

Problemi correlati