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

Die folgende Zeile erstellt die Ausnahme.NoSuchFieldException bei getClass(). GetField()

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

studioplanCategory ist ein gültiges Objekt und hat tatsächliche Werte. Wegen dieser Ausnahme funktionieren die load Methode und die Suchfunktion in der LazyLoading DataTable meiner JSF Webapp nicht.

Antwort

7

App feuert diese Ausnahme, weil seine nicht sieht weist darauf hin, dass du es zurückgeben willst. Die Methode getField() gibt nicht-private Attribute zurück. Wenn Ihre Attribute privat sind, werden sie von der Methode nicht angezeigt. Sie können überprüfen http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.html

So können Sie tun, dass Ihre Attribute auf geschützten oder öffentlichen ändern und dann sollte es richtig funktionieren. Aber auf diese Art und Weise (das gleiche Beispiel wie auf Hauptgesichtern) wird eine echte Datenbank simuliert.

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

... 

Also diese Liste simuliert zum Beispiel echte Datenbank nur. Wenn du es benutzen willst. Sie sollten es also tun, wenn Sie die Bean-Klasse unterstützen. Sie öffnen die Verbindung bereits mit einem Filter oder nicht und geben dann Daten aus der Datenbank zurück.

// EDIT: Man schrieb, dass Sie getDeclaredField() verwenden sollte, aber ich tat dies versuchen und es nicht gut funktionieren, und IlegalAccessException wirft. Wenn ein Vortyp geschützt ist, funktioniert es gut. Ich weiß nicht warum.

+0

Hallo Aber ich habe die Ausnahme auch beim Versuch geschützt.Die Ausnahme aufgetreten atjava.lang.IllegalAccessException: Klasse com.buddhiedge.server.model.StudyplanLazyDataModel kann nicht auf ein Mitglied der Klasse com.buddhiedge.server.entity.StudyplanCategory mit Modifikatoren zugreifen " protected " – user1281029

+0

Hi Sein funktionierender öffentlicher Zugriffsspezifizierer, obwohl es gegen die Prinzipien ist, dass wir Mitgliedsfelder von DATABASE TABLE (in diesem Fall) als privat behalten sollten. – user1281029

+0

Man hatte ich das gleiche Problem, aber wenn eine geänderte Attribute zu schützen, so IllegalAccessEception Nachricht wurde nicht mehr angezeigt. Also versuche es in die Öffentlichkeit zu ändern. es sollte funktionieren. Die Wahrnehmung hat bereits eine Lösung wie field.setAccessible (true) geschrieben; Aber später, versuchen Sie es in Ihrer Backing-Bean-Klasse zu tun, in @PostConstruct erstellen Sie neue LazyDataModel-Klasse und dort erstellen Sie Anweisung für Ihre Datenbank bereits mit Filter und Anweisung wird zu Ihnen gefilterten Daten zurück, es ist "Lazy Loading". – Sajmon

18

Vom Javadoc für Class.getField(...):

Gibt ein Field-Objekt, das den angegebenen öffentlichen Member-Feld der Klasse oder Schnittstelle dieses Klasse-Objekt dargestellt wird reflektiert. Der Name Parameter ist ein String, der den einfachen Namen des gewünschten Feldes angibt. Das zu reflektierende Feld wird durch den folgenden Algorithmus bestimmt. Sei C die durch dieses Objekt repräsentierte Klasse:

Wenn C ein öffentliches Feld mit dem angegebenen Namen deklariert, wird das Feld reflektiert. Wenn in Schritt 1 oben kein Feld gefunden wurde, wird dieser Algorithmus rekursiv auf jede direkte Superschnittstelle von C angewendet. Die direkten Superschnittstellen werden in der Reihenfolge durchsucht, in der sie deklariert wurden. Wenn in den obigen Schritten 1 und 2 kein Feld gefunden wurde und C eine Superklasse S hat, wird dieser Algorithmus rekursiv auf S aufgerufen. Wenn C keine Superklasse hat, wird eine NoSuchFieldException ausgelöst. Siehe Java Sprachspezifikation, Abschnitte 8.2 und 8.3.

Wenn das Feld, das Sie über abzurufen versuchen:

studyplanCategory.getClass().getField(filterProperty) 

privat ist, dann werden Sie eine NoSuchFieldException bekommen. Für private Felder, versuchen Sie stattdessen:

studyplanCategory.getClass().getDeclaredField(filterProperty) 

Und um potenzielle illegale Zugang Ausnahmen zu erhalten, wenn die Werte über ein Feld auf diese Weise einstellen:

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

Hallo Ich habe versucht, dass jetzt die Ausnahme java.lang.IllegalAccessException geändert – user1281029

+0

Sieht aus wie Sie bereits um Ihr Problem bekommen haben könnte, aber auf jeden Fall sehen Bearbeitungen für die, wie man umgehen Sie die Ausnahme für den illegalen Zugriff. – Perception

1

besten Lösungen für getClass().getField() Problem sind:

Verwendung getDeclaredField() statt 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

Ich hatte das gleiche Problem. Mein Problem war, dass meine Variablen nicht public sind. Stellen Sie sicher, dass Ihre Klassenvariablen Öffentlichkeit

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

} 
Verwandte Themen