2012-04-25 7 views
5
java.lang.NoSuchFieldException: id 

La riga seguente sta creando l'eccezione.NoSuchFieldException su getClass(). GetField()

String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); 

studyplanCategory è un oggetto valido e ha valori reali. A causa di questa eccezione, il metodo di caricamento e la funzione di ricerca nel LazyLoading DataTable della mia webapp JSF non funzionano.

risposta

7

App incendi fino questa eccezione perché il suo non vede attribuisce la tua voglia di restituire. Metodo getField() restituisce gli attributi non privati, quindi se gli attributi sono privati, il metodo non li vede. Puoi controllare http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html

Quindi puoi fare in modo che i tuoi attribuzioni cambino su protetto o pubblico e quindi dovrebbero funzionare correttamente. Ma in questo modo (come per esempio su primefaces) si simula un vero database.

public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { 
     List<Car> data = new ArrayList<Car>(); 

     //filter 
     for(Car car : datasource) { 
      boolean match = true; 

      for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
       try { 
        String filterProperty = it.next(); 
        String filterValue = filters.get(filterProperty); 
        String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car)); 

... 

Quindi questa lista simulare base di dati reali solo per esempio. Se vuoi usarlo. quindi devi farlo sul backing bean class e ce la fai. Si apre la connessione già con un filtro o no e quindi si restituiscono i dati dal database.

// MODIFICA: l'uomo ha scritto che dovresti usare getDeclaredField() ma ho provato questo e non ha funzionato bene e genera IlegalAccessException. Quando un pretype attribuisce a protetto, funziona bene. Non so perché.

+0

Hi ma mi sono l'eccezione, anche quando si cerca protected.The verificata un'eccezione durante atjava.lang.IllegalAccessException: Classe com.buddhiedge.server.model.StudyPlanLazyDataModel non può accedere a un membro della classe di com.buddhiedge.server.entity.StudyplanCategory con modificatori " protetto " – user1281029

+0

Ciao Il suo specificatore di accesso pubblico funzionante, sebbene sia contro i principi che dovremmo mantenere i campi membri di DATABASE TABLE (in questo caso) come privati. – user1281029

+0

Man ho avuto lo stesso problema ma quando gli attributi sono stati modificati in modo che il messaggio IllegalAccessEception non fosse più mostrato. Quindi prova a cambiarlo in pubblico. dovrebbe funzionare. Percezione ha già scritto una soluzione come field.setAccessible (true); Ma dopo, prova a farlo nella tua classe di bean backing, in @PostConstruct creerai una nuova classe LazyDataModel e creerai già una dichiarazione per il tuo database con filtro e la dichiarazione tornerà ai tuoi dati filtrati, è "lazy loading". – Sajmon

18

Dal Javadoc per Class.getField(...):

Restituisce un oggetto campo che riflette il campo membro pubblico specificato della classe o interfaccia rappresentata da questo oggetto Class. Il parametro nome è una stringa che specifica il nome semplice del campo desiderato. Il campo da riflettere è determinato dall'algoritmo che segue. Sia C la classe rappresentata da questo oggetto:

Se C dichiara un campo pubblico con il nome specificato, cioè il campo a riflettersi. Se non è stato trovato alcun campo nel passaggio 1 sopra, questo algoritmo viene applicato in modo ricorsivo a ciascuna superinterfaccia diretta di C. Le superinterfacce dirette vengono ricercate nell'ordine in cui erano state dichiarate . Se non è stato trovato alcun campo nei passaggi 1 e 2 sopra, e C ha una superclasse S , allora questo algoritmo viene invocato ricorsivamente su S. Se C non ha una superclasse, viene lanciata una NoSuchFieldException. Vedere la Specifica della lingua Java , sezioni 8.2 e 8.3.

Se il campo si sta tentando di recuperare tramite:

studyplanCategory.getClass().getField(filterProperty) 

è privata, quindi si otterrà un NoSuchFieldException. Per i campi privati, provate questo invece:

studyplanCategory.getClass().getDeclaredField(filterProperty) 

E per aggirare eventuali eccezioni di accesso illegali durante l'impostazione dei valori tramite un campo in questo modo:

Field field = studyplanCategory.getClass().getDeclaredField(filterProperty); 
field.setAccessible(true); 
field.get(studyplanCategory); 
+0

Ciao ho provato che ora l'eccezione cambiato in java.lang.IllegalAccessException – user1281029

+0

Sembra che si potrebbe avere ottenuto intorno il problema già, ma in ogni caso vedo le modifiche per il modo di aggirare l'eccezione di accesso illegale. – Perception

1

migliori soluzioni per getClass().getField() problema sono:

Usa getDeclaredField() al posto di getField()

1)

String propertyName = "test";<br/> 
Class.forName(this.getClass().getName()).getDeclaredField(propertyName); 

2)

String propertyName = "name";<br/> 
Replace **"HelloWorld"** with your class name<br/> 
HelloWorld.class.getDeclaredField(propertyName) 
0

Avevo affrontato lo stesso problema. Il mio problema era che le mie variabili non erano pubbliche. Assicurarsi che le variabili di classe sono pubblico

private Object getVariableValue(Object clazz, String variableName) { 
    try { 
     Field field = clazz.getClass().getField(variableName); 
     return field.get(clazz); 
    } catch (NoSuchFieldException e) { 
     return ""; 
    } catch (IllegalAccessException e) { 
     return ""; 
    } 

} 
Problemi correlati