0

Wir verwenden JPA (Eclipse 2.5.2 und habe auch versucht, 2.6.2) und sind mit Blick auf eine ungerade Ausgabe:NoClassDefFound in Proxy-Klasse mit InvocationHandler und rufen

Wir haben einige Klassen, die über einen Proxy zugegriffen werden von sich selbst (wie in diesem Beitrag (der markierte Lösung) beschrieben: Call a method any time other methods are called)

jetzt sind wir das folgende Problem konfrontiert: Wenn getResultList() auf der benannten Abfragen aufrufen, bekommen wir jetzt diese Ausnahme:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class java.lang.reflect.Proxy$ProxyAccessHelper 
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:746) 
at com.sap.core.persistence.jdbc.trace.ResultSetProxy.createProxy(ResultSetProxy.java:27) 
at com.sap.core.persistence.jdbc.trace.TraceablePreparedStatement.executeQuery(TraceablePreparedStatement.java:78) 
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1007) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:642) 
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:558) 
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:1991) 
at org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:570) 
at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:250) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:242) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:228) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:299) 
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:694) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2738) 
at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2691) 
at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:495) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1168) 
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:899) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1127) 
at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:403) 
at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1215) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1793) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1775) 
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1740) 
at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258) 
at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:469) 

Ich debuggte in diesem für eine lange Zeit vergebens . Die jpa using-Methode befindet sich im selben Kontext wie der Proxy definiert ist, also sollte eigentlich die eigentliche Proxy-Klasse existieren.

Edit: Ich habe gerade festgestellt, dass das Problem nicht JPA verwandt ist. Ich bekomme das gleiche Problem, wenn ich method.getAnnotations() innerhalb des Proxys ausführe. Ich bekomme die gleiche Ausnahme wie oben tief in einem Java-Stacktrack (parseAnnotations und Sachen, zu schlecht, die ich heute Nachmittag nicht bearbeitet habe, als ich Zugriff auf den StackTrace hatte). Dies bedeutet, dass es ein Problem mit dem Klassenladeprogramm ist und ich kann es einfach nicht verstehen.

Wenn jemand eine Ahnung hat, bitte erleuchte mich.

Danke und Gruß, Kay

+0

Die Methode, die in JPA aufruft, hat Sichtbarkeit, aber hat die JPA-Bibliothek (und der Klassenlader, der sie geladen hat) Sichtbarkeit für die Proxy-Klasse? – Chris

+0

Wie kann ich das herausfinden? Alles, was verwendet wird, befindet sich im Grunde im selben Projekt und jpa wird über Maven hinzugefügt und alles wird als Kriegsdatei auf einem Tomcat bereitgestellt, daher sollte jpa Sichtbarkeit für die Klassen innerhalb dieses Projekts haben. Ich bemerkte ein ähnliches Problem später btw: Es gibt auch einige Überprüfungen auf Methoden Anmerkungen im Proxy (der eigentliche Zweck des Proxys ist es, diese Anmerkungen zu überprüfen). Wenn jedoch Method.getAnnotations() aufgerufen wird, wird dieselbe Ausnahme wie oben beschrieben ausgelöst, was bedeutet, dass es sich nicht um ein JPA-Problem, sondern um ein anderes Klassenladeproblem handelt. –

Antwort

0

das Problem gefunden, und es ist völlig unabhängig von Klassenladeprogramme, die Sichtbarkeit und Sachen:

Aus irgendwelchen Gründen habe ich noch nicht die Webapps Ordner in meinem Kater heraus didn Wenn meine Pakete neu verteilt werden, werden sie nicht bereinigt, und es sind alte Dateien und Bundles usw. dort, die die oben beschriebene Ausnahme verursachen.

es manuell Gereinigt, eingesetzt, um alles zu tomcat -> funktioniert wie ein Charme ...

Ich hasse es, wenn eine solche willkürliche Probleme zu Fehlern führen.