Ich verwende Spring <aop:aspectj-autoproxy />
, um einige JPA-Repository -Schnittstellen zu übernehmen.
Die Proxyfunktion schlägt jedoch mit folgendem Cannot subclass final class class $Proxy80
fehl:
Die CGLIB-Unterklasse der Klasse [Klasse $ Proxy80] konnte nicht generiert werden: Common Ursachen für dieses Problem sind die Verwendung einer letzten Klasse oder einer nicht sichtbaren Klasse Klasse; verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Kann nicht Unterklasse final class class $ Proxy80
Wie der Fehler, und ein schneller Google, vorschlägt - dies geschieht, wenn das Proxy-Ziel eine letzte Klasse ist. In dieser Kette gibt es jedoch keine Klassen - nur Schnittstellen. Spring generiert alle Implementierungen zur Laufzeit.
Hier ist die Definition der Schnittstelle, die fehlschlägt:
%Vor%Hinweis Ich verwende eine benutzerdefinierte Unterklasse von spring's JpaRepository und QueryDslPredicateExecutor , wie folgt definiert:
%Vor%An anderer Stelle definiere ich benutzerdefinierte Aspekte für Methoden an diesen Schnittstellen:
%Vor% Ich habe bestätigt, dass diese @Aspect
-Definitionen das Problem verursachen, indem Sie sie entfernen und die App erneut ausführen.
Was verursacht diesen Fehler? Es scheint so zu sein, dass die Proxy-Übertragung aus irgendeinem Grund fehlschlägt.
Meine Vermutung ist, dass Spring-Daten JPA die Repo-Implementierung als Java-Proxy erstellt, die final ist und dann <aop:aspectj-autoproxy />
versucht, einen weiteren Proxy für Ihren Aspekt zu erstellen, indem Sie cglib-Unterklassen verwenden, die nicht funktionieren . Ist proxy-target-class
im Autoproxy-Element auf true
gesetzt?