2015-11-28 13 views
5

Ho un metodo che utilizzo per convalidare un POJO in Spring MVC (questo mi consente di fare affidamento sullo @Annotation nel POJO e allo stesso tempo di validare il POJO programmaticamente quando e dove voglio senza usare l'annotazione @Valid).Come definire dinamicamente la classe che può essere utilizzata come parametro in un metodo?

Avevo bisogno di passare la classe dell'oggetto al metodo al fine di convalidare:

public void validate(Class clazz, Object model, BindingResult result){  
    ...   
    Set<ConstraintViolation<clazz>> constraintViolations=validator.validate((clazz)model); 
     for (ConstraintViolation<clazz> constraintViolation : constraintViolations) { 
... 
} 

Il mio codice non è corretto, dal momento che un ottenere l'errore:

clazz cannot be resolved to a type

Come dovrei modificare il mio codice per poter passare a questo metodo qualsiasi classe che desidero?

Grazie

+1

si può dare un po 'più di contesto e ciò che il caso d'uso per chiamare metodi come 'Setlist (Man)' è? La maggior parte delle volte le persone provano che non è effettivamente necessario perché non è possibile utilizzare un tipo "dinamico" nel codice. Perché la dinamica è in fase di esecuzione e prima dovrai scrivere codice e tipi. – zapl

+0

Ho modificato il mio post. Ho parlato di una lista per rendere il mio problema più semplice da capire. :) – MDP

risposta

4

È possibile generify il metodo

public <T> void setList(Class<T> clazz){ 
    List<T> list = new ArrayList<>(); 
} 

e chiamarlo come segue

setList(Person.class) 
+1

Questo ti darebbe un elenco polimorfico, ma non è facile includere questo metodo in una classe generica funzionante. Potresti fornire un piccolo esempio di classe con un tipo di variabile List come proprietà, dove questo metodo accetta un argomento come sopra? – slezica

+1

@ uʍopǝpısdn "working generic class" è un termine che non capisco –

+0

Se si tenta di includere questo metodo in una classe con una proprietà List , con metodi utili, si incontreranno problemi che possono essere risolti in diversi modi. Questo non funziona molto bene con la digitazione statica. Dovresti, penso, includere un esempio reale; in modo che la risposta non nasconda la complessità effettiva – slezica

2

Si dovrebbe usare generico:

public <T> void setList(){ 
    List<T> list = new ArrayList<>(); 
} 
... 
obj.<Man>setList(); 
obj.<Woman>setList(); 
obj.<Person>setList(); 

o

public <T> void setList(Class<T> clazz){ 
     List<T> list = new ArrayList<>(); 
    } 
... 
    obj.setList(Woman.class); 
    obj.setList(Man.class); 
    obj.setList(Person.class); 

o

public static class MyClass <T> { 
    public <T> void setList() { 
     List<T> list = new ArrayList<>(); 
    } 
} 
... 
new MyClass<Woman>().setList(); 
new MyClass<Man>().setList(); 
new MyClass<Person>().setList(); 

Aggiornamento: Invece di codice

public void validate(Class clazz, Object model, BindingResult result){  
    ...   
    Set<ConstraintViolation<clazz>> constraintViolations=validator.validate((clazz)model); 
     for (ConstraintViolation<clazz> constraintViolation : constraintViolations) { 
... 
} 

utilizzare il codice

public void <T> validate(Class<T> clazz, Object<T> model, BindingResult result){  
    ...   
    Set<ConstraintViolation<T>> constraintViolations=validator.validate(model); 
     for (ConstraintViolation<T> constraintViolation : constraintViolations) { 
... 
} 
+0

Grazie amico, funziona. Non ho mai studiato ancora quella sintassi. Cosa significa in una firma del metodo? Suppongo sia che il metodo possa restituire qualsiasi tipo di dati !? Perché dovrei inserire all'interno della firma? Il mio problema non è il tipo di ritorno, ma come passare qualsiasi tipo al metodo? Grazie per la spiegazione – MDP

+2

Immaginate che per ogni tipo invece di Java generi 3 metodi per Uomo, Donna e Persona e sostituisca in codice Uomo, Donna e Persona. È più facile capire cosa significa . –

+0

Grazie, ho capito :) – MDP

2

Credo che tu non hai bisogno di una t ipo e può usare un jolly non legato:

public void validate(Class<?> clazz, Object model, BindingResult result){  
    ...   
    Set<ConstraintViolation<?>> constraintViolations=validator.validate(model); 
     for (ConstraintViolation<?> constraintViolation : constraintViolations) { 
... 
} 

https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

Problemi correlati